我在我的Rails应用中使用omniauth-coinbase和coinbase-ruby。
在我的应用中,用户通过Coinbase登录,生成code
,然后转为access_token
和refresh_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_token
和refresh_token
存储为字符串,以便当用户返回时,我可以使用两个活动令牌或使用{{1}生成两个新标记,如here"访问标记和刷新标记"
Coinbase公开了refresh_token
方法,我可以在我的refresh!
OAuth实例上调用该方法应该给我两个新的令牌。
coinbase
正常运行,但当我从用户模型中删除数据库中的现有令牌(有效或无效)时,不,创建{{1}如上所述,哈希实例化一个新的OAuth客户端,然后在其上调用refresh!
。
据我的研究了解,user_credentials
到期了。我每次都使用refresh!
同时获得新的access_token
和新的refresh_token
。所以在我看来,我应该能够实例化一个新的OAuth客户端,为它提供两个密钥并运行access_token
以使我恢复正常工作并能够对Coinbase API进行有效调用。
任何人都可以帮忙解决我可能做错的事吗?谢谢!
我从refresh_token
收到的错误如下:
refresh!
答案 0 :(得分:5)
通过自己实现这一点,我既可以重现所描述的异常,也可以创建工作代码。
要重现描述的例外情况,我必须使用 旧令牌 。尝试再次刷新时,这始终产生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
<强> 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应用程序以供参考。