私はsocialauthを使用してgoogle、facebook et al(ここではgoogleを想定します)でログインしようとしていますが、それがどのように機能するかについて質問があります。SeamなしでJSF2を使用しています。基本的な考え方は次のとおりです。
Googleでログインすることを示すAPI呼び出しを数回行います。
GoogleのURLを返す別のAPI呼び出しを行います。
あなたのサイトにリダイレクトするためにグーグルによって使用される結果のURLを提供します。
GoogleのURLにリダイレクトします。
その後、グーグルはすぐにあなたのサイトにリダイレクトするか、最初にログインの詳細を尋ねます。
私の混乱は、アウトバウンド側とインバウンド側からのデータをリンクすることです。スタートページ(上記のリンク)で、彼らはこれを提案しています:
アウトバウンド
SocialAuthManager manager = new SocialAuthManager();
String successUrl = "http://my.domain.com/socialauthd/successAction.xhtml";
String url = manager.getAuthenticationUrl(id, successUrl);
// Store in session
session.setAttribute("authManager", manager);
インバウンド
// get the auth provider manager from session
SocialAuthManager manager = (SocialAuthManager)session.getAttribute("authManager");
私が抱えている問題は、これがどのように機能するかわからないことであり、テストではありません。SocialAuthManagerのインスタンスへの参照をセッションに保存することを提案していますが、Googleからリクエストを受信すると、新しいセッションが作成されます。JSESSIONID Cookieがないため、最初にGoogleにリクエストを送信したセッションの一部ではありません。
これを回避するために、socialauth apiから一意のリクエストごとのIDを取得し(openid.assoc_handle-クエリパラメーターとして送信されます)、アプリスコープのBeanのconcurrentHashMapに配置し、preRenderViewリスナーの参照を取得します。完了ページ(successUrl-どちらの方法でも呼び出されるため、例では不適切な名前が付けられています)。
これはすべて、ドキュメントに含まれていないものにとっては非常に面倒なことのようです。私は通常CODI@ViewAccessScopedを使用していますが、@ RequestScopedCDIBeanでこれを試しました。CODIを使用して、成功URLにwindowIdを追加し、リダイレクトにJSESSIONID Cookieを追加しようとしましたが、どちらのアプローチも機能しません。Beanの範囲は適切ではないと思いますが、情報が多ければ多いほどよいでしょう。
スプリング、シーム、ストラットの例に飛び込むことはできますが、純粋なEE 6開発者にとっては多くのオーバーヘッドがあり、この問題をよりよく理解することで、シンプルで実用的なJSFのみの例を作成できます。 Googleコードで使用するsocialauthチーム。
私は明らかな何かを見逃していますか、それともこれは単に複雑である必要がありますか?もしそうなら、なぜ彼らは単に機能しないアプローチを文書化したのですか?
編集: Yahooでのテストでは、正しいログインの詳細が提供されない限り、自分のサイトにリダイレクトされないことがわかったため、successUrlには思ったよりも適切な名前が付けられていると思います。これはすべてのプロバイダーで同じだと思います。このソリューションに関するコメントをsocialauthサイトに追加しました。また、この問題についてログに記録した問題にもコメントを追加しました(どちらも、socialauthプロジェクトに関係する人からの応答を受け取っていません)。