2012-05-03 13 views
6

誰もが私にこの問題の底に手を差し伸べることができますか?Devise + Omniauthコールバックが正しいコントローラにヒットしないのはなぜですか?

私はDevils + OmniauthをRails 3.2アプリで使用しています。私が知りたいことは、Deviseのuser_omniauth_authorize_path(provider)メソッドで何が起こっているのかです。

私はレイクルートと宝石のソースから掘り出し物を持っていましたが、私が持っている問題の原因となるものは何も明白ではありません。

このメソッドはプロバイダのsignin url(たとえばTwitter)を呼び出し、routes.rbで定義されたコールバックパスに戻ると仮定します。私は、ユーザー/ omniauth_callbacks_controller.rbで

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'} 

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

を持っている私のroutes.rbをで

私は<%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>を持つビューで

def twitter 
    render :text => "This works" 
end 

def passthru 
    render :text => "This doesn't work" 
end 

を持っています。このリンクをクリックするとログインできるTwitterに行きますが、アプリに戻ったら「あなたはすでにサインインしています」というエラーが表示されます。

このエラーがどのように発生するのか、またなぜこのエラーが発生するのかは分かりません。私は "この作品"または "これは動作しません"を見ているだけです。

Facebookのプロバイダもまったく同じ方法で設定していますが、これは期待どおりに動作します。

私がDevitsのomniauthリンクを<a href="https://stackoverflow.com/users/auth/twitter">Twitter</a>に置き換えた場合、「これはうまくいく」と表示されます。

これは私の問題を解決しますが、それは理想的ではなく、私は理由を知りたいと思います。

誰でも光を放つことはできますか?

EDIT

レーキルートは次のようになります。

user_omniauth_callback  /users/auth/:action/callback(.:format)      users/omniauth_callbacks#(?-mix:twitter|facebook) 

答えて

1

まあ、それは間違いなくあなたの最後に何かあるので、それは、私のために働いています。まず、コンソールでGETが2種類の方法で得られた/users/auth/twitter/users/auth/twitter?callbackを呼び出したことを比較しましたか?それらはまったく同じに見えるはずです(もちろんトークンと検証者を除いて)。

これが関連しているかどうかはわかりませんが、パススルールートを使用しないようにすることで、そのルートを削除できます。代わりに、あなたのコールバックコントローラでは、悪い要求を処理する失敗というアクションを実装する必要があります。 deviseの実装のためにSee here

私はここにストローで把握していますが、あなたはまた、あなたのコールバックコントローラの最後にこれを持っている必要があります。

# This is necessary since Rails 3.0.4 
# See https://github.com/intridea/omniauth/issues/185 
# and http://www.arailsdemo.com/posts/44 
protected 
def handle_unverified_request 
    true 
end 
+0

こんにちはaskitaka、これらの提案に感謝。私は勧告に基づいて 'パススルー 'を使用しています。https://github.com/plataformatec/devise/wiki/OmniAuth:-Overviewとhttp://stackoverflow.com/questions/5531263/omniauth-doesnt-work-with-route -globbing-in-rails3ルートのグロビング。これはもはやお勧めですか?とにかく、あなたは私にいくつかの新しいことを考えさせてくれました。ありがとう!私はこれを試して報告します。 –

+0

こんにちは、GETコールを比較することで意味を説明できますか?コンソールで 'app.get '/ users/auth/twitter''を実行しました。どちらの呼び出しも '302'を返します。これは期待されています。これらの呼び出しを詳細に調べる方法はありますか?または302リダイレクトに従う? –

+0

Doh!これについてもう少し考えてみると、あなたは正しいです。それはパススルー機能でした。私はルートにキャッチを持っているのでパススルーを使用しています。他の作業をしている間、私はこの機能を編集して私の質問に従ってテキストをレンダリングしました。しかし、このコントローラの目的は、omniauthリクエストで404を返すことです。パススルー機能がなければ、オムニアは単に機能しません。ちょっと愚かな気分になりました:)このことを指摘してくれてありがとう! –

関連する問題