2013-11-26 93 views
2

我正在嘗試編寫一個基於oauth2 gem的簡單OAuth2客戶端。這個想法是在會話中存儲訪問令牌,並檢查每個請求之前它是否沒有過期。如何檢查令牌是否已過期

用於獲取一個新的令牌下面的代碼看起來像這樣:

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

client.client_credentials.get_token.expired? 

和它的正常工作。請求我的api被解僱,最後一行顯示令牌是否過期。問題是,當我試圖通過自己恢復令牌狀態:

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

這行代碼不火的請求,我的API,並在這一事業,不知道那是什麼令牌生存,expires_at參數或其他任何東西。除了「令牌」 PARAM一切都是零,從而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:[email protected]/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={}> 

難道我做錯了什麼或者是某種錯誤的?總結一下:我需要檢查存儲在會話中的令牌(作爲字符串)是否已過期。

+0

請問您的代碼實現這一行? – screenmutt

+0

是的,它達到了它 – mbajur

+0

它是否給出錯誤?結果究竟是什麼? – screenmutt

回答

1

如果您檢查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?

+0

但是1)過期通常在提供者一方處理,並且2)資源所有者通常可以在任何時候撤銷訪問。我們需要一種優雅的方式來處理過期/撤銷令牌,而無法從客戶端預測它。 –

相關問題