Создание подписи и Nonce для OAuth (Ruby)

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

по данным OAuth API SmugMug, OAuth требует шести параметров.

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

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

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

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

3 ответов


за подписью

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

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

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

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

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

посмотреть это суть эрикельдриджа на github и руководство для начинающих по OAuth дополнительные

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

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


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

require 'securerandom'

...

nonce = SecureRandom.hex()

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


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