使用 Ruby/Rails 进行 Base 64 URL 解码?

发布于 2024-10-12 05:00:06 字数 352 浏览 1 评论 0原文

我正在使用 Facebook API 和 Ruby on Rails,并尝试解析返回的 JSON。我遇到的问题是 Facebook base64URL 对其数据进行编码。 Ruby 没有内置的 base64URL 解码。

有关base64编码和base64URL编码之间的区别,请参阅维基百科

如何使用 Ruby/Rails 对其进行解码?

编辑

因为有些人阅读有困难 - Base64 URL 与 Base64 不同

I am working with the Facebook API and Ruby on Rails and I'm trying to parse the JSON that comes back. The problem I'm running into is that Facebook base64URL encodes their data. There is no built-in base64URL decode for Ruby.

For the difference between a base64 encoded and base64URL encoded, see wikipedia.

How do I decode this using Ruby/Rails?

Edit:

Because some people have difficulty reading - base64 URL is DIFFERENT than base64

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

悸初 2024-10-19 05:00:06

德米特里的回答是正确的。它考虑了字符串解码之前必须出现的“=”符号填充。我不断收到格式错误的 JSON,最后发现这是由于填充造成的。 详细了解 Facebooksigned_request 的 base64_url_decode

这是我使用的简化方法:

 def base64_url_decode(str)
   str += '=' * (4 - str.length.modulo(4))
   Base64.decode64(str.tr('-_','+/'))
 end

Dmitry's answer is correct. It accounts for the '=' sign padding that must occur before string decode. I kept getting malformed JSON and finally discovered that it was due to the padding. Read more about base64_url_decode for Facebook signed_request.

Here's the simplified method I used:

 def base64_url_decode(str)
   str += '=' * (4 - str.length.modulo(4))
   Base64.decode64(str.tr('-_','+/'))
 end
雪若未夕 2024-10-19 05:00:06

谷歌搜索“base64 for URL ruby​​”并选择第一个结果,我找到了答案

 cipher_token =encoded_token.tr('-_','+/').unpack('m')[0]

cipher_token 的详细信息不是
重要的是它可以包含任何
字节值。

当然,您可以为 base64UrlDecode( data ) 创建一个助手。

发生的情况是,它采用 encoded_token 并将所有 -_ 字符替换为 +/ 分别。然后,它使用 unpack('m') 解码 Base64 编码的数据,并返回返回数组中的第一个元素:您的解码数据。

Googling for "base64 for URL ruby" and choosing the first result lead me to the answer

 cipher_token = encoded_token.tr('-_','+/').unpack('m')[0]

The details of the cipher_token aren't
important save that it can contain any
byte values.

You could then, of course, make a helper to base64UrlDecode( data ).

What's happening is that it takes the encoded_token and replaces all the - and _ characters with + and /, respectively. Then, it decodes the base64-encoded data with unpack('m') and returns the first element in the returned array: Your decoded data.

南城追梦 2024-10-19 05:00:06

对于 base64URL 编码的字符串 s...

s.tr('+/', '-_').unpack('m')[0]

For base64URL-encoded string s...

s.tr('+/', '-_').unpack('m')[0]
爱的十字路口 2024-10-19 05:00:06

这就是我解析我的facebook应用程序的signed_request的方式

def decode_facebook_hash(signed_request)
  signature, encoded_hash = signed_request.split('.')
  begin
    ActiveSupport::JSON.decode(Base64.decode64(encoded_hash))
  rescue ActiveSupport::JSON::ParseError
    ActiveSupport::JSON.decode(Base64.decode64(encoded_hash) + "}")
  end
end

救援部分只添加一个“}”,因为facebook有时很奇怪,让它脱离了解码的哈希(也许他们已经修复了它......)。

That's the way i parse the signed_request of my facebook application

def decode_facebook_hash(signed_request)
  signature, encoded_hash = signed_request.split('.')
  begin
    ActiveSupport::JSON.decode(Base64.decode64(encoded_hash))
  rescue ActiveSupport::JSON::ParseError
    ActiveSupport::JSON.decode(Base64.decode64(encoded_hash) + "}")
  end
end

The rescue part only add a '}', becouse facebook is weird enough to let it out of de encoded hash sometimes (maybe they fixed it already...).

妥活 2024-10-19 05:00:06
def decode64_url(str)
  # add '=' padding
  str = case str.length % 4
    when 2 then str + '=='
    when 3 then str + '='
    else
      str
  end

  Base64.decode64(str.tr('-_', '+/'))
end
def decode64_url(str)
  # add '=' padding
  str = case str.length % 4
    when 2 then str + '=='
    when 3 then str + '='
    else
      str
  end

  Base64.decode64(str.tr('-_', '+/'))
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文