gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:33:53 27 4
gpt4 key购买 nike

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

在我的应用程序中,用户通过 Coinbase 登录,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_tokenrefresh_token 作为字符串存储在用户模型上,这样当用户回来时,我可以使用两个事件 token 或使用refresh_token 生成两个新 token ,如 here 部分所述“访问 token 和刷新 token ”

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

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

根据我的研究,access_token 已过期。我每次都使用 refresh_token 来获取新的 access_token 和新的 refresh_token。所以在我看来,我应该能够实例化一个新的 OAuth 客户端,给它两个 key 并运行 refresh! 让我回到工作状态并能够对 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>'

最佳答案

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

为了重现所描述的异常,我不得不使用旧标记。尝试再次刷新时,这始终会产生 401 NOT AUTHORIZED HTTP 响应。这是通过在我自己的刷新代码中实现错误而偶然发生的。虽然我已经成功地保留了从 OAuth 重定向返回的 token ,但是一旦我刷新了一次新 token ,我就忘记了将新 token 保留回模型。 注意:刷新 token 会给您一个新的 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

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

最后,这可能是 this question 的副本, 尽管它不那么具体。

关于ruby-on-rails - 在用户模型上存储 access_token 和 refresh_token 并再次使用它们会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com