Создание подписи и одноразового номера для OAuth (Ruby) - PullRequest
8 голосов
/ 24 декабря 2010

Я хочу получить доступ к API SmugMug из моего приложения, чтобы получить альбомы и изображения пользователей (пользователи прошли проверку подлинности с помощью OmniAuth ruby).

Согласно API-интерфейсу OAuth SmugMug Для OAuth требуется шесть параметров.

Я могу получить токен с помощью OmniAuth, и временная метка должна быть легкой (Time.now.to_i, верно?).Есть две вещи, которые я не знаю, как генерировать - oauth_nonce и oauth_signature.

Согласно документам oauth, я генерирую одноразовый номер с помощью временной метки, но как именно я это сделаю?Должна ли она быть определенной длины и ограничена определенными символами?

И, конечно, подпись.Как бы я сгенерировал подпись HMAC-SHA1 с помощью ruby?Я знаю, что oauth gem может это сделать, но я бы сгенерировал его сам для использования с OmniAuth.Глядя на код, у меня возникают проблемы с расшифровкой того, как камень oauth генерирует сигнал.

Спасибо за любую помощь.

Ответы [ 3 ]

11 голосов
/ 21 января 2011

за подпись

def sign( key, base_string )
  digest = OpenSSL::Digest::Digest.new( 'sha1' )
  hmac = OpenSSL::HMAC.digest( digest, key, base_string  )
  Base64.encode64( hmac ).chomp.gsub( /\n/, '' )
end#def

Вам не нужно генерировать одноразовый номер из метки времени, но это может иметь смысл, поскольку метка времени, очевидно, уникальна, поэтому она делает хороший начальный вход для любой функции рандомизации.

Я использую это, (что я получил от другого вопроса здесь и изменил)

def nonce
  rand(10 ** 30).to_s.rjust(30,'0')
end#def

но вы можете использовать все, что генерирует уникальную строку.

См. этот гриф от erikeldridge на github и Руководство для начинающих по OAuth для получения дополнительной информации

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

С тех пор я обнаружил, что есть лучший способ генерировать случайные строки в стандартной библиотеке Ruby, SecureRandom .

4 голосов
/ 14 декабря 2011

Одноразовый номер также может быть просто случайным числом с большим числом, например, используя класс SecureRandom в Ruby (не используйте rand):

require 'securerandom'

...

nonce = SecureRandom.hex()

Генерирует 16-байтовое случайное число в шестнадцатеричном формате.

0 голосов
/ 24 декабря 2010

Почему вы не используете для этого рубиновые камни Oauth?

...