![](/img/trans.png)
[英]Get the access_token and refresh_token using Azure AD with rails
[英]Storing an access_token and refresh_token on the user model and using them again causes error
我在Rails應用程序中使用omniauth-coinbase和coinbase-ruby 。
在我的應用程序中,用戶通過Coinbase登錄,該Coinbase生成一個code
,然后我將其變成access_token
和refresh_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_token
和refresh_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_token
和refresh_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.