在用户模型上存储access_token和refresh_token并再次使用它们会导致错误

时间:2014-06-01 19:42:50

标签: ruby-on-rails ruby oauth-2.0 omniauth coinbase-api

我在我的Rails应用中使用omniauth-coinbasecoinbase-ruby

在我的应用中,用户通过Coinbase登录,生成code,然后转为access_tokenrefresh_token

然后,我在变量coinbase下创建一个新的OAuth客户端,它具有完整的功能。

user_credentials = {
    :access_token => access_token,
    :refresh_token => refresh_token,
    :expires_at => Time.now + 1.day
}
coinbase = Coinbase::OAuthClient.new(ENV['COINBASE_CLIENT_ID'], ENV['COINBASE_CLIENT_SECRET'], user_credentials)

问题出现的地方:

我将用户模型上的access_tokenrefresh_token存储为字符串,以便当用户返回时,我可以使用两个活动令牌或使用{{1}生成两个新标记,如here"访问标记和刷新标记"

一节中所述

Coinbase公开了refresh_token方法,我可以在我的refresh! OAuth实例上调用该方法应该给我两个新的令牌。

生成新的OAuth客户端后,

coinbase正常运行,但当我从用户模型中删除数据库中的现有令牌(有效或无效)时,,创建{{1}如上所述,哈希实例化一个新的OAuth客户端,然后在其上调用refresh!

据我的研究了解,user_credentials到期了。我每次都使用refresh!同时获得新的access_token和新的refresh_token。所以在我看来,我应该能够实例化一个新的OAuth客户端,为它提供两个密钥并运行access_token以使我恢复正常工作并能够对Coinbase API进行有效调用。

任何人都可以帮忙解决我可能做错的事吗?谢谢!

我从refresh_token收到的错误如下:

refresh!

2 个答案:

答案 0 :(得分:5)

通过自己实现这一点,我既可以重现所描述的异常,也可以创建工作代码。

要重现描述的例外情况,我必须使用 旧令牌 。尝试再次刷新时,这始终产生401 NOT AUTHORIZED HTTP响应。这是通过在我自己的刷新代码中实现错误而发生的。虽然我已经成功地保留了从OAuth重定向返回的令牌,但是一旦我刷新了新令牌,我忘了将新的令牌保留回模型。 注意:刷新令牌会为您提供新的access_tokenrefresh_token返回。

继续前进,我最终得到的工作代码如下:

def test_refresh
  @old_tokens =
    {
      :access_token  => current_user.access_token,
      :refresh_token => current_user.refresh_token
    }

  client =
    Coinbase::OAuthClient.new \
      Rails.application.secrets.coinbase_api_key,
      Rails.application.secrets.coinbase_api_secret,
      @old_tokens

  new_token = client.refresh!

  @new_tokens =
    {
      :access_token  => new_token.token,
      :refresh_token => new_token.refresh_token
    }

  current_user.access_token  = @new_tokens[ :access_token ]
  current_user.refresh_token = @new_tokens[ :refresh_token ]
  current_user.save!
end

<强> FULL WORKING EXAMPLE

令牌被保留在底部的用户身上,防止旧的/过期的令牌被使用。

最后,这可能与this question重复,但不太具体。

答案 1 :(得分:0)

我无法重现此错误。您是否尝试在调用Coinbase :: OAuthClient.new之前打印出所有相关值?确保client_id,client_secret和user_credentials都存在且正确。

此外,将凭证哈希直接序列化到您的用户模型可能更容易。在https://github.com/coinbase/coinbase-oauth-rails-example查看我们的示例rails应用程序以供参考。