2013-11-26 3 views
2

Я пытаюсь написать простой клиент OAuth2 на основе драгоценного камня 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? 

Эта строка кода не будет срабатывать запрос на мой апи и, в причине, что не имеет ни малейшего представления о том, что маркер времени жизни, expires_at парам или что-то еще. Все, кроме 'лексем Парам равна нулю, так 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) владельцы ресурсов обычно могут отменить доступ в любое время. нам нужен грациозный способ обработки истекших/отозванных токенов, не имея возможности прогнозировать их со стороны клиента. –

Смежные вопросы