为OAuth创建签名和Nonce(Ruby)

kmu*_*h79 8 ruby ruby-on-rails oauth omniauth ruby-on-rails-3

我希望从我的应用程序访问SmugMug的API以获取用户的相册和图像(用户已经通过ruby的OmniAuth进行了身份验证).

根据SmugMug的OAuth API,OAuth需要六个参数.

我可以使用OmniAuth获取令牌,时间戳应该很简单(Time.now.to_i对吗?).有两件事我不知道如何生成 - oauth_nonce和oauth_signature.

根据oauth docs,我通过时间戳生成nonce,但我究竟会怎么做呢?它是否需要一定长度并限于某些字符?

当然还有签名.如何使用ruby生成HMAC-SHA1 sig?我知道oauth gem可以做到,但我宁愿自己生成它以与OmniAuth一起使用.看一下代码,我无法破译oauth gem如何生成sig.

感谢您的任何帮助.

iai*_*ain 11

签名

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
Run Code Online (Sandbox Code Playgroud)

你不必产生从时间戳的随机数,但它可以使意义,因为时间戳显然是独一无二的,所以它使任何随机化函数一个很好的起点输入.

我用这个,(我从这里得到另一个问题并修改)

def nonce
  rand(10 ** 30).to_s.rjust(30,'0')
end#def
Run Code Online (Sandbox Code Playgroud)

但您可以使用任何生成唯一字符串的内容.

由erikeldridge在github上这个要点新手指南的OAuth更多

编辑

我发现在Ruby标准库SecureRandom中有更好的方法来生成随机字符串.


Joh*_*hnK 5

nonce 也可以只是一个大的、适当的随机数 - 例如,使用 Ruby 的 SecureRandom 类(不要使用“rand”):

require 'securerandom'
Run Code Online (Sandbox Code Playgroud)

...

nonce = SecureRandom.hex()
Run Code Online (Sandbox Code Playgroud)

这会以十六进制格式生成一个 16 字节的随机数。