【问题标题】:Creating Signature and Nonce for OAuth (Ruby)为 OAuth (Ruby) 创建签名和随机数
【发布时间】:2011-05-30 07:44:14
【问题描述】:

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

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby oauth ruby-on-rails-3 omniauth


    【解决方案1】:

    对于签名:

    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
    

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

    请参阅this gist by erikeldridge on githubBeginner’s Guide to OAuth 了解更多信息

    编辑

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

    【讨论】:

    • 我想再次表示感谢,因为您链接到的要点非常有用。但是,我无法让它与 1.9.2 一起使用,并且无法完全弄清楚为什么 - 你解决了这个问题吗?
    • 我在 1.9.2 上写了这个,所以如果它不起作用,那么也许是别的东西?您有任何错误消息要分享吗?在让它工作之前,我必须写很多日志语句,任何加密都需要它和测试,否则你会发现很难找到问题。
    • 感谢您的回复。我说的是你链接到的要点,但我发现了问题——CGI.parse 将 url 参数的值转换为一个数组(它在 1.8.7 中没有这样做),这搞砸了我的API 调用。一切正常。感谢您的宝贵时间。
    • nonce = OpenSSL::Random.random_bytes 12
    【解决方案2】:

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

    require 'securerandom'
    

    ...

    nonce = SecureRandom.hex()
    

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

    【讨论】:

    • 一个问题。这个解决方案可能是完美的,但它有一个主要问题。如何保存所有随机数?我简直不能。无论如何,解决方案必须基于时间戳。请参阅此链接。 stackoverflow.com/questions/6865690/…
    • 你需要一个随机数缓存,是的。随机数缓存受时间限制。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回复。我想使用 OmniAuth(并设置它)并且不确定如何将它与 oauth 集成。 OmniAuth 可以为我提供除这两件事之外的所有内容,所以我宁愿自己编写它们。
    • omniauth 尽你所能。无需检查 oauth 参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2011-02-07
    • 2012-09-17
    • 2023-03-06
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多