6

この問題の根底にたどり着くのを手伝ってくれる人はいますか?

Rails 3.2 アプリで Devise + Omniauth を使用しています。user_omniauth_authorize_path(provider)私が知りたいのは、Devise の方法で舞台裏で何が起こっているかということです。

rake ルートと gem のソースを調べてみましたが、私が抱えている問題の原因となる明らかなものは何も見つかりません。

このメソッドは単にプロバイダーのサインイン URL (Twitter など) を呼び出してから、routes.rb で定義されたコールバック パスに戻ると想定しています。

私のroutes.rbには

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

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

users/omniauth_callbacks_controller.rb には

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

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

私が持っているビューで<%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>。このリンクをクリックすると、ログインできる Twitter に移動しますが、アプリに戻ると、「既にサインインしています」というエラーが表示されます。

このエラーがどのように、またはなぜ生成されているのかわかりません。「これは機能します」または「これは機能しません」のみが表示されるはずです。

また、まったく同じ方法で Facebook プロバイダーをセットアップしましたが、これは期待どおりに機能します。

Devise の omniauth リンクを置き換えると<a href="/users/auth/twitter">Twitter</a>、"This works" と表示されます。

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

誰でも光を当てることができますか?

編集

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

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

1 に答える 1

1

まあ、それは私のために働いているので、それは間違いなくあなたの側にあるものです. まず、コンソールで GET 呼び出しを比較し/users/auth/twitter/users/auth/twitter?callback2 つの異なる方法で取得しましたか? それらはまったく同じに見えるはずです (もちろん、トークンとベリファイアを除いて)。

さて、これが関係しているかどうかはわかりませんが、devise ではパススルー ルートを使用しないので、そのルートを削除できます。代わりに、コールバック コントローラーで、不正なリクエストを処理する失敗というアクションを実装する必要があります。デバイスの実装については、こちらを参照してください。

ここでストローをつかんでいますが、コールバックコントローラーの最後にもこれが必要です:

# 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
于 2012-05-05T02:10:39.357 に答える