2011-01-17 14 views
11

私はFacebook APIとRuby on Railsで作業しています。戻ってきたJSONを解析しようとしています。私が取り組んでいる問題は、Facebookのbase64URLがデータをエンコードすることです。 Ruby用の組み込みのbase64URLデコードはありません。ベース64 Ruby/RailsでのURLデコード?

base64エンコードとbase64URLエンコードの違いは、see wikipediaです。

Ruby/Railsを使ってこれをどのようにデコードしますか?

編集

一部の人々は困難読みを持っているので - BASE64のURLはbase64URLエンコードされた文字列sについて

答えて

5

URL ruby​​ "を選択し、最初の結果を選択するとthe answer

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

重要: のバイト値を含めることができます。

もちろん、助手をbase64UrlDecode(data)にすることもできます。何が起こっている

は、それがencoded_tokenをとり、それぞれ+/、とすべての-_文字を置き換えることです。次に、base64でエンコードされたデータをunpack('m')でデコードし、返された配列の最初の要素を返します。デコードされたデータ。

+0

いや、私はこれを見たhttp://www.ruby-forum.com/topic/167232、それは私の最初の結果ではなかった。とにかく私のために2ページ目。私はそれが実際に何をしているのか分からない...私は他の方法に行く必要がある – sethvargo

+0

Facebookがあなたに送るデータをデコードしたいと思った...?上記の例では、 'encoded_token'はFacebookがあなたに送るもので、' cipher_token'はデコードされた結果です。 – davemyron

+0

パディングの処理方法が原因で、この解決策でJSONエラーが発生することがあります。ソリューションについては、http://qugstart.com/blog/ruby-and-rails/facebook-base64-url-decode-for-signed_request/を参照してください。 – pschang

5

をbase64では異なっている...

のためのbase64「のためにグーグルで
s.tr('+/', '-_').unpack('m')[0] 
+0

を多分...それは何をしています:

ここで私が使用簡略化された方法ですか?私はルビーをかなりうまく使っていますが、あなたは私を殴ってしまいました。 – sethvargo

+0

'+'から '-'に' /'を '_'に変換します。これはプレーンなbase64を生成し、組み込みのbase64 unpackerを使って1要素の配列を返します。 '[0]'で実際の文字列の結果を取得します。あなたは '[0]'を '.first'に置き換えることができます – DigitalRoss

+0

他の方法にして、base64でエンコードされた文字列を' s.tr( '-_'、 '+ /') – DigitalRoss

3

Facebookは(時には多分彼らは固定・デ・エンコードされたハッシュからそれを聞かせするのに十分な奇妙ですbecouse、私は救助部分のみが「}」を追加私のFacebookアプリケーション

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 

のsigned_requestを解析する方法ですそれはすでに...)。

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 
12

ドミトリーの回答は正しいです。これは、文字列のデコードの前に発生しなければならない '='符号の埋め込みを説明します。私は間違った形式のJSONを続けていましたが、最終的にはパディングが原因であることがわかりました。 Read more about base64_url_decode for Facebook signed_request

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

私は3または4ではなく、1または2でパッドするのは合法だと思います。 str.lenght.modulo(4)がゼロの場合は、パッドしないでください。 http://en.wikipedia.org/wiki/Base64 –

+0

注:strict_decode64またはurlsafe_decode64を使用すると、 '='の4つのパディングが壊れているように見えますが、decode64では許容されます。 –

関連する問題