Rails 3.1 OAuth-провайдер "invalid_grant" с devise_oauth2_providable - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь настроить поставщика oauth2 на использование приложения, которое уже содержит omniauth и разрабатывает. User.rb теперь:

class User < ActiveRecord::Base

  has_many :authentications
  has_many :graphs

  devise :database_authenticatable,
    :registerable, 
    :recoverable, 
    :rememberable, 
    :trackable, 
    :validatable, 
    :omniauthable, 
    :token_authenticatable,
    :oauth2_providable, 
    :oauth2_password_grantable,
    :oauth2_refresh_token_grantable,
    :oauth2_authorization_code_grantable

.......

}

Все остальное реализовано, как и ожидалось, но я получаю следующую ошибку, когда запускаю все это локально и пытаюсь использовать гем oauth2 (0.5.0) для подключения к моему клиенту.

Я в конечном итоге:

http://localhost:8080/oauth/callback?code=2ebd3d9d149b22becec37da7a8f1eb0d

, что вызывает исключение:

e.to_yaml
"--- !ruby/exception:OAuth2::Error\nresponse: &70266332040280 !ruby/object:OAuth2::Response\n  response: &70266332040340 !ruby/object:Faraday::Response\n    env:\n      :method: :post\n      :body: ! '{\"error\":\"invalid_grant\",\"error_description\":\"invalid authorization\n        code request\"}'\n      :url: !ruby/object:Addressable::URI\n        validation_deferred: false\n        scheme: http\n        normalized_scheme: !!null \n        uri_string: !!null \n        hash: !!null \n        host: localhost\n        authority: !!null \n        normalized_host: !!null \n        port: 3000\n        normalized_port: !!null \n        path: /oauth2/token\n        normalized_path: !!null \n        query: !!null \n        normalized_query: !!null \n      :request_headers:\n        Content-Type: application/x-www-form-urlencoded\n      :parallel_manager: !!null \n      :request:\n        :proxy: !!null \n      :ssl: {}\n      :status: 400\n      :response_headers:\n        content-type: application/json\n        x-ua-compatible: IE=Edge\n        cache-control: no-cache\n        x-runtime: '0.119701'\n        content-length: '82'\n        server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)\n        date: Wed, 05 Oct 2011 14:40:10 GMT\n        connection: close\n      :response: *70266332040340\n    on_complete_callbacks: []\n  options:\n    :parse: !!null \n  error: !ruby/exception:OAuth2::Error\n    response: *70266332040280\n    code: invalid_grant\n    description: invalid authorization code request\n  parsed:\n    error: invalid_grant\n    error_description: invalid authorization code request\ncode: invalid_grant\ndescription: invalid authorization code request\n"

Я также замечаю, что не указано состояние, которое в последнем черновике (http://tools.ietf.org/html/draft-ietf-oauth-v2-22) требуется для обратного вызова. Может ли это быть проблемой?

Что касается вывода, я не получаю никаких очевидных ошибок в выводе сервера:

http://pastie.org/2644028

Теперь, еще одна вещь, на которую стоит обратить внимание, это то, что я вижу, что происходит несколько SELECT, но я никогда не вижу, чтобы какие-либо данные вставлялись в различные таблицы, особенно в коды authorization_codes, которые происходят непосредственно перед выдачей этого исключения.

Ответы [ 2 ]

1 голос
/ 10 октября 2011

После просмотра запросов выглядит, что текущее время прошло за значением expired_at. Ниже приведен код devise_oauth2_providable, который вызывает эту ошибку:

module Devise
  module Strategies
    class Oauth2AuthorizationCodeGrantTypeStrategy < Oauth2GrantTypeStrategy
      def grant_type
        'authorization_code'
      end

      def authenticate!
        if client && code = AuthorizationCode.valid.find_by_token(params[:code])
          success! code.user
        elsif !halted?
          oauth_error! :invalid_grant, 'invalid authorization code request'
        end
      end
    end
  end
end

Эта действительная область проверяет, является ли текущее время большим или равным полю expires_at в AuthorizationCode.

0 голосов
/ 10 октября 2011

Я не гений Rails, но я знаю, как обходиться с GitHub, и мне удалось найти несколько человек, совершающих коммиты на свои вилки.Объединив несколько корректно выглядящих исправлений в одном месте, мне удалось создать форк, который отлично работал для меня:

https://github.com/socialcast/devise_oauth2_providable/pull/17

Я установил его в качестве источника в Gemfile, и теперь работает обратный вызовотлично!

Теперь мне просто нужно разобраться, как остановить истечение срока действия маркеров доступа, или каким-то образом вставить user_id в ответ darn ... Работа работа работа.

...