11

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

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

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

根据 oauth 文档,我通过时间戳生成随机数,但我该怎么做呢?它是否需要一定的长度并限制为某些字符?

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

感谢您的任何帮助。

4

3 回答 3

15

对于签名:

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

但是您可以使用任何生成唯一字符串的东西。

有关更多信息,请参阅github 上 erikeldridge 的此要点OAuth 初学者指南

编辑

从那以后,我发现在 Ruby 标准库SecureRandom中有一种更好的方法来生成随机字符串。

于 2011-01-21T12:11:59.837 回答
5

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

require 'securerandom'

...

nonce = SecureRandom.hex()

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

于 2011-12-14T15:37:15.790 回答
1

为什么你不只使用 Oauth ruby​​ gems 来做到这一点?

于 2010-12-24T08:08:15.813 回答