この問題の根底にたどり着くのを手伝ってくれる人はいますか?
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)