使用Ruby / Rails进行基本64位URL解码?

时间:2011-01-17 00:40:18

标签: ruby-on-rails ruby json encoding base64

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

对于base64编码和base64URL编码之间的差异,see wikipedia

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

修改

因为有些人阅读有困难 - base64网址与base64不同

5 个答案:

答案 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