簡體   English   中英

在用戶模型上存儲access_token和refresh_token並再次使用它們會導致錯誤

[英]Storing an access_token and refresh_token on the user model and using them again causes error

我在Rails應用程序中使用omn​​iauth-coinbasecoinbase-ruby

在我的應用程序中,用戶通過Coinbase登錄,該Coinbase生成一個code ,然后我將其變成access_tokenrefresh_token

然后,我在變量coinbase下創建一個新的OAuth Client,它具有完整的功能。

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上的用戶模型作為字符串,以便當用戶回來,我既可以使用兩個活動令牌或使用refresh_token產生兩個新的標記,如節中提到這里 “訪問令牌和刷新令牌”

Coinbase展示了refresh! 我可以在我的coinbase OAuth實例上調用的方法,該實例應該給我兩個新令牌。

refresh! 正常工作后,我產生一個新的OAuth客戶端而不是當我拉從數據庫中現有的標記(有效或無效)關閉用戶模式,創建一個user_credentials散列如上所述,實例化一個新的OAuth客戶端,然后調用refresh! 在那。

據我的研究了解, access_token過期了。 每當獲取新的access_token和新的refresh_token時,我都會使用refresh_token 因此,在我看來,我應該能夠實例化一個新的OAuth客戶端,為其提供兩個密鑰並運行refresh! 使我恢復正常工作,並能夠對Coinbase API進行有效調用。

有人可以幫我解決我可能做錯的事情嗎? 謝謝!

我從refresh!得到錯誤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>'

通過自己實現這一點,我既可以重現所描述的異常,也可以創建工作代碼。

要重現所描述的異常,我必須使用舊標記 嘗試再次刷新時,這始終會產生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

完整的示例

令牌將被持久保留在底部的用戶手中,從而防止使用舊的/過期的令牌。

最后,這可能是該問題的重復部分,盡管它的具體程度要低得多。

我無法重現此錯誤。 在調用Coinbase :: OAuthClient.new之前,您是否嘗試過打印所有相關值? 確保client_id,client_secret和user_credentials都存在並且正確。

同樣,將憑據哈希直接直接序列化到您的用戶模型可能會更容易。 https://github.com/coinbase/coinbase-oauth-rails-example上查看我們的示例Rails應用程序以供參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM