次の要件でSSOソリューションを実装する必要があります。
a.com
、b.com
、sso.com
があるとしましょう。 a.com
からログインした場合、b.com
にアクセスしてもログインする必要はありません。a.com
で[ログイン]をクリックした未登録のユーザーには、sso.com
でホストされているログイン画面が表示されます。資格情報は、それにのみアクセス可能なデータソースのsso.com
によってチェックされます。a.com
にログインし、その後b.com
にアクセスすると、すぐにログインされます。つまり、b.com
では、「ログイン」リンクの代わりに、ユーザー名などをすぐに表示したい-何もクリックする必要がない。a.com
、またはb.com
にアクセスしたときに、ページ全体をsso.com
にすばやくリダイレクトして、ログインしているかどうかを確認する必要があります。そのようなリダイレクトSEOとレイテンシに悪影響を及ぼします。a.com
にログインしてb.com
(またはその逆)にアクセスした少数のユーザーは、リダイレクトが許可されます。
特にOAuth2、OpenID Connect、CASを使用したSSOの例はWebに多数ありますが、これらの特定の要件のレシピは見つかりませんでした。最も近いのはStackoverflow SSOガイド( こちら )ですが、私にはない追加の要件があります(たとえば、SSOサーバーがダウンしてもログインは機能するはずです)。
このOpenID Connectスキームはそれを行うべきだと私には思えます。 ただし、私はセキュリティの専門家ではないので、それ以上の確認なしに使用しないでください。
a.com
、b.com
、sso.com
にログインしていません。a.com
にアクセスし、[ログイン]をクリックします。sso.com
の戻りURLをパラメーターとして使用して、a.com
にリダイレクトします。sso.com
はそれらを受け入れ、承認コードをパラメーターとしてa.com
にリダイレクトします。リダイレクト応答には、sso.com
のSSOセッションCookieもあります。a.com
をクエリします。 a.com
サーバーは認証コードをバックエンドのsso.com
に送信し、アクセストークンとIDトークンを受信し、a.com
にセッションCookieを設定します。ユーザーはa.com
にログインしています。b.com
にアクセスします。b.com
のJavascriptは、カスタムエンドポイント(例:sso.com
)へのsso.com/has-sso-session
へのサイレントCORS AJAX呼び出し)を行います。エンドポイントは基本的にtrue
/false
リクエストのSSO cookieの存在に基づきます。true
、JavaScriptはブラウザをsso.com
にリダイレクトし、戻りURLはb.com
asパラメータにあります。これにより、通常のOpenID Connect認証がトリガーされます。これは、ユーザーがSSO Cookieを持っているため、自動的に行われます。その最後に、b.com
サーバーは認証コードをバックエンドのsso.com
に送信し、アクセストークンとIDトークンを受信し、b.com
にセッションCookieを設定します。ユーザーはb.com
にログインしています。false
、JavaScriptはSSO check failed
にb.com
セッションCookieを設定します。これにより、ユーザーが[ログイン]をクリックしない限り、b.com
を参照するときに、それ以上のチェックが行われなくなります。リダイレクトせずにSSOを実行する最も簡単で唯一の方法は、すべてのアプリケーションがサブドメイン(a.site.com
、b.site.com
)。サブドメインはドメインレベルのCookieを共有できるため、アプリケーションは最初のリクエストからログインCookieを受け取ることができます。
アプリケーションを複数の無関係なプライマリドメイン(a.com
、b.com
)、ページロード時にSSOサービスにクロスドメインリクエストを送信するJavaScriptを用意して、アクセストークンの取得を続行するかどうかを決定するのが最善の方法です。スパイダーはJavaScriptを実行しないため、これはSEOに影響しません。また、ログに記録されていないユーザーによる最初のページの読み込みにより、匿名バージョンのページが表示されるため、匿名ユーザーのレイテンシは追加されません。