我正在使用Facebook API和Ruby on Rails,我正在尝试解析返回的JSON。我遇到的问题是Facebook base64URL对其数据进行编码。 Ruby没有内置的base64URL解码。
对于base64编码和base64URL编码之间的差异,see wikipedia。
如何使用Ruby / Rails对此进行解码?
修改:
因为有些人阅读有困难 - base64网址与base64不同
答案 0 :(得分:12)
答案 1 :(得分:5)
对于base64URL编码的字符串s
...
s.tr('+/', '-_').unpack('m')[0]
答案 2 :(得分:5)
使用“base64 for URL ruby”搜索并选择第一个结果,然后引导我the answer
cipher_token = encoded_token.tr('-_','+/').unpack('m')[0]
cipher_token的详细信息不是 重要的是它可以包含任何 字节值。
当然,你可以帮助base64UrlDecode( data )
。
正在发生的事情是它需要encoded_token
并分别用-
和_
替换所有+
和/
个字符。然后,它使用unpack('m')
对base64编码的数据进行解码,并返回返回数组中的第一个元素:解码数据。
答案 3 :(得分:3)
这就是我解析我的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很奇怪,有时会让它脱离编码哈希(也许他们已经修好了......)。
答案 4 :(得分:2)
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