декодировать URL base 64 с помощью Ruby / Rails? - PullRequest
12 голосов
/ 17 января 2011

Я работаю с API Facebook и Ruby on Rails и пытаюсь проанализировать возвращаемый JSON. Проблема, с которой я сталкиваюсь, заключается в том, что Facebook base64URL кодирует их данные. Для Ruby нет встроенного декодера base64URL.

О разнице между закодированным base64 и base64URL см. Википедию .

Как мне декодировать это, используя Ruby / Rails?

Редактировать

Поскольку некоторые люди испытывают затруднения при чтении, URL base64 отличается от base64

Ответы [ 5 ]

12 голосов
/ 08 февраля 2011

Дмитрий ответ правильный.Он учитывает заполнение знака '=', которое должно произойти до декодирования строки.Я продолжал получать искаженный JSON и наконец обнаружил, что это было из-за отступов. Подробнее о base64_url_decode для Facebook signature_request .

Вот упрощенный метод, который я использовал:

 def base64_url_decode(str)
   str += '=' * (4 - str.length.modulo(4))
   Base64.decode64(str.tr('-_','+/'))
 end
5 голосов
/ 17 января 2011

Поиск в Google для «base64 for URL ruby» и выбор первого результата привели меня к ответу

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

Детали cipher_token не важны, кромеон может содержать любые байтовые значения.

Вы можете, конечно, сделать помощник для base64UrlDecode( data ).

Что происходит, так это то, что он принимает encoded_token и заменяет всесимволы - и _ с + и / соответственно.Затем он декодирует данные в кодировке base64 с помощью unpack('m') и возвращает первый элемент в возвращенном массиве: Ваши декодированные данные.

5 голосов
/ 17 января 2011

Для строки в кодировке base64URL s ...

s.tr('+/', '-_').unpack('m')[0]
3 голосов
/ 17 января 2011

Так я анализирую подписанный запрос моего приложения на 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

Спасательная часть добавляет только '}', потому что facebook достаточно странный, чтобы иногда выводить его из дешифрованного хэша (возможно, они уже исправили это ...).

2 голосов
/ 02 февраля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...