gpt4 book ai didi

ruby-on-rails - 如何检查 token 是否已过期

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:29 27 4
gpt4 key购买 nike

我正在尝试基于 oauth2 gem 编写一个简单的 OAuth2 客户端。这个想法是在 session 中存储一个访问 token ,并在每次请求之前检查它是否未过期。

以下获取新 token 的代码如下所示:

client = OAuth2::Client.new(
'26b8e5c92367d703ad35a2fc16b14dc93327a15798068ccba473aa2e3d897883',
'b16079915cdc20b5373f1601e31cece5a84274f772cfd89aec12c90fd110775e',
site: 'http://localhost:3000'
)

client.client_credentials.get_token.expired?

而且它工作正常。对我的 api 的请求被触发,最后一行显示 token 是否已过期。问题是当我试图自己恢复 token 状态时:

OAuth2::AccessToken.new(client, session[:api_token]).expired?

这行代码不会触发对我的 api 的请求,因此,不知道 token 生命周期、expires_at 参数或其他任何东西是什么。除了 'token' 参数之外的所有内容都是 nil,所以 expired? 方法总是返回 false:

#<OAuth2::AccessToken:0x007fad4c9e2e28 @client=#<OAuth2::Client:0x007fad4ddb7160 @id="26b8e5c92367d703ad35a2fc16b14dc93327a15798068ccba473aa2e3d897883", @secret="b16079915cdc20b5373f1601e31cece5a84274f772cfd89aec12c90fd110775e", @site="http://localhost:3000", @options={:authorize_url=>"/oauth/authorize", :token_url=>"/oauth/token", :token_method=>:post, :connection_opts=>{}, :connection_build=>nil, :max_redirects=>5, :raise_errors=>true}, @client_credentials=#<OAuth2::Strategy::ClientCredentials:0x007fad4ddb6f80 @client=#<OAuth2::Client:0x007fad4ddb7160 ...>>, @connection=#<Faraday::Connection:0x007fad4ddb6738 @headers={"User-Agent"=>"Faraday v0.8.8"}, @params={}, @options={}, @ssl={}, @parallel_manager=nil, @default_parallel_manager=nil, @builder=#<Faraday::Builder:0x007fad4ddb6620 @handlers=[Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp]>, @url_prefix=#<URI::HTTP:0x007fad4ddb60d0 URL:http://localhost:3000/>, @proxy=nil, @app=#<Faraday::Request::UrlEncoded:0x007fad4ddb4190 @app=#<Faraday::Adapter::NetHttp:0x007fad4ddb4280 @app=#<Proc:0x007fad4ddb4370@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/faraday-0.8.8/lib/faraday/connection.rb:93 (lambda)>>>>>, @token="114781bdace77fa7f4629e2b42dbe68ac73326728dddc8102b9c2269e3e86a36", @refresh_token=nil, @expires_in=nil, @expires_at=nil, @options={:mode=>:header, :header_format=>"Bearer %s", :param_name=>"access_token"}, @params={}>

我是做错了什么还是某种错误?总结一下:我需要检查存储在 session 中的 token (作为字符串)是否已过期。

最佳答案

如果检查 AccessToken 的代码,您必须传递包含“expires_at”值的第三个参数(选项),该值在您调用过期时使用? :

def initialize(client, token, opts={})
@client = client
@token = token.to_s
[:refresh_token, :expires_in, :expires_at].each do |arg|
instance_variable_set("@#{arg}", opts.delete(arg) || opts.delete(arg.to_s))
end
@expires_in ||= opts.delete('expires')
@expires_in &&= @expires_in.to_i
@expires_at &&= @expires_at.to_i
@expires_at ||= Time.now.to_i + @expires_in if @expires_in
@options = {:mode => opts.delete(:mode) || :header,
:header_format => opts.delete(:header_format) || 'Bearer %s',
:param_name => opts.delete(:param_name) || 'access_token'}
@params = opts
end

...

def expired?
expires? && (expires_at < Time.now.to_i)
end

来源:https://github.com/intridea/oauth2/blob/master/lib/oauth2/access_token.rb#L42

因此将您的代码更新为:

OAuth2::AccessToken.new(client, session[:api_token], {expires_at: session[:expires_at]}).expired?

关于ruby-on-rails - 如何检查 token 是否已过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215737/

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