Создание подписи и 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-байтовое случайное число в шестнадцатеричном формате.