6

私は現在このrailscastをフォローしていますが、特定の状況では、omniauthからのコールバックでファラデータイムアウトエラーが発生しています。

現在、私はRailsアプリケーションをAPIとして使用し、バックボーンをjavascriptフロントエンドとして使用しています(同じアプリケーション上で)

OAuthを使用してAPIをロックダウンすることを決定し、OmniauthがクライアントとしてAPIにアクセスするためのカスタム戦略と、承認ロジックを処理するためのDoorkeeperを提供しました。

 module OmniAuth
      module Strategies
        class Twiddle < OmniAuth::Strategies::OAuth2
          option :name, :twiddle
    
          option :client_options, {
            site: "http://localhost:3001",
            authorize_path: "/oauth/authorize"
          }
    
          uid do
            raw_info["id"]
          end
    
          info do
            { 
              firstName: raw_info["firstName"],
              lastName: raw_info["lastName"], 
              email: raw_info["email"]
            }
          end
    
          def raw_info
            @raw_info ||= access_token.get('/api/v1/user').parsed
          end
        end
      end
    end

私はこのようなカスタム戦略を含めました:

require File.expand_path('lib/omniauth/strategies/twiddle', Rails.root)

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twiddle, id, secret # Omitting the actual ones for obvious reasons
end

私は現在、バンドルでこれらの宝石を使用しています

# OAuth 
gem 'oauth2'
gem 'omniauth'
gem 'omniauth-oauth2'
gem 'omniauth-facebook'
gem 'doorkeeper'

ここで私は認証を行い、適切なアクセストークンを取得しようとします(また、行き詰まった場所でもあります)

 def loginParse
    if ( user = User.authenticate( params[:email], params[:password] ) ) 
      session[:user_id] = user.id
      redirect_to '/auth/twiddle/' 
    else 
      render :controller => "authentication", :action => "loginIndex", :notice => "Incorrect credentials" 
    end
  end

これがroutes.rbからのルーティングです

  # Oauth urls
  match '/auth/twiddle/callback', to: "authentication#connectAPI"
  match "/auth/facebook/callback", to: "authentication#loginSocialMedia"

アプリケーションはconnectAPIアクションをレンダリングできず、この時点で完全にスタックします(サーバーログによって提供されます)

  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  Doorkeeper::Application Load (0.2ms)  SELECT `oauth_applications`.* FROM `oauth_applications` WHERE `oauth_applications`.`uid` = '' LIMIT 1
  CACHE (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  Doorkeeper::AccessToken Load (0.3ms)  SELECT `oauth_access_tokens`.* FROM `oauth_access_tokens` WHERE `oauth_access_tokens`.`revoked_at` IS NULL AND `oauth_access_tokens`.`application_id` = 1 AND `oauth_access_tokens`.`resource_owner_id` = 1 ORDER BY created_at desc LIMIT 1
   (0.1ms)  BEGIN
  Doorkeeper::AccessGrant Load (0.2ms)  SELECT `oauth_access_grants`.* FROM `oauth_access_grants` WHERE `oauth_access_grants`.`token` = '' LIMIT 1
  SQL (1.1ms)  INSERT INTO `oauth_access_grants` (`application_id`, `created_at`, `expires_in`, `redirect_uri`, `resource_owner_id`, `revoked_at`, `scopes`, `token`) VALUES (1, '2012-08-08 03:10:31', 600, 'http://localhost:3001/auth/twiddle/callback', 1, NULL, '', '')
   (1.4ms)  COMMIT
Redirected to http://localhost:3001/auth/twiddle/callback?code=a
Completed 302 Found in 12ms (ActiveRecord: 3.7ms)
(twiddle) Callback phase initiated.

uids/重要な情報の多くはログから省略されています。

最後に、このエラーが発生します。

Faraday :: Error :: TimeoutError(Timeout :: Error):

私はこの問題の説明を徹底的に行ったことを望みます。

omn​​iauthのコールバックによって開始された部分でアプリケーションがフリーズしているように見える理由がわかりません。他のいくつかのstackoverflowの質問が私を指摘したので、私はバンドラーを更新しようとしましたが、それは機能していません。

おそらく、OAuth2についての私の理解は少し曖昧です。

誰かが私を助けることができれば、私はそれを大いに感謝します

4

1 に答える 1

5

これがあなたに当てはまるかどうかはわかりませんが、ここにいるのは私のシナリオでした:

問題

  • 内部 OAuth サーバーが必要とするデータを含むアプリ
  • データがほとんどまたはまったくない OAuth サーバー
  • データを移動せずに App1 の認証部分を App2 にオフロードしたい

解決

  • App1 は App2 を認証サーバーとして使用します
  • App2 はユーザー データに App1 を使用します

このソリューションの問題

デッドロック - App1 は App2 からの OAuth 応答を待っていますが、その応答を完了するために、App2 は App1 からの応答を待つ必要があります。

最終観察

Rails の開発モード (WebBrick を使用) では、マルチスレッドを実行できないため、リクエストが完了できない可能性があります。

私の解決策

私の解決策は、 pumaをインストールしてに追加する ことでしたconfig/environments/development.rb

if ENV["THREADS"]
  config.threadsafe!
end

次に、サーバーを起動するときにTHREADS=1 rails s Puma、OAuth をテストします。

また

または、シナリオがまったく異なり、実際にはサービス間で通信していません。extra_info(Github のような/user) エンドポイントは OAuth サーバーで機能していますか? あなたのコールバックは実際に何かをしていますか?

これが役立つことを願っています!

于 2012-08-24T16:12:24.253 に答える