2

我在我的 Rails 应用程序中使用了 omniauth-coinbasecoinbase-ruby 。

在我的应用程序中,用户通过 Coinbase 登录,它生成 acode然后我将其变成 anaccess_token和 a refresh_token

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

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)

这是问题开始的地方:

我将 User 模型上的access_token和存储refresh_token为字符串,这样当用户回来时,我可以使用两个活动令牌或使用refresh_token生成两个新令牌,如“访问令牌和刷新令牌”部分所述

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

refresh!在我生成一个新的 OAuth 客户端后正常工作,但当从用户模型的数据库中提取现有令牌(有效或无效)、创建user_credentials如上所述的哈希、实例化一个新的 OAuth 客户端,然后调用refresh!它时不能正常工作。

据我的研究了解,access_token过期了。我使用一个refresh_token无论何时都获得一个新的access_token和一个新的refresh_token。所以在我看来,我应该能够实例化一个新的 OAuth 客户端,给它两个密钥并运行 arefresh!以使我恢复正常工作并能够对 Coinbase API 进行有效调用。

任何人都可以在这里帮忙看看我可能做错了什么吗?谢谢!

我得到的错误refresh!如下:

OAuth2::Error: invalid_request: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed.
{"error":"invalid_request","error_description":"The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed."}
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/oauth2-0.9.4/lib/oauth2/client.rb:113:in `request'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/oauth2-0.9.4/lib/oauth2/client.rb:138:in `get_token'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/oauth2-0.9.4/lib/oauth2/access_token.rb:86:in `refresh!'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/coinbase-2.0.0/lib/coinbase/oauth_client.rb:58:in `refresh!'
/Users/zackshapiro/dev/stopcoin/lib/tasks/short.rake:14:in `block (3 levels) in <top (required)>'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.1.0/lib/active_record/relation/delegation.rb:46:in `each'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/gems/activerecord-4.1.0/lib/active_record/relation/delegation.rb:46:in `each'
/Users/zackshapiro/dev/stopcoin/lib/tasks/short.rake:6:in `block (2 levels) in <top (required)>'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `eval'
/Users/zackshapiro/.rvm/gems/ruby-2.0.0-p451/bin/ruby_executable_hooks:15:in `<main>'
4

2 回答 2

5

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

为了重现所描述的异常,我不得不使用old tokens401 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

完整的工作示例

令牌在底部被持久化回用户,防止使用旧的/过期的令牌。

最后,这可能是这个问题的副本,尽管它的具体程度要低得多。

于 2014-06-04T06:50:23.993 回答
0

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

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

于 2014-06-04T04:39:13.053 回答