メインコンテンツへスキップ
Auth0はアプリケーションのために、IDプロバイダー()起点の応答を Connect(OIDC)応答に変換する方法を提供しています。 OIDプロトコルはIdP起点の認証フローに対応しませんが、この方法ではフォームPOSTを使用した暗黙フローを使ってIdP起点の認証フローを模倣することができます。
ログインフローの起点はIdPではなく、OIDCアプリケーションにすることを強くお勧めします。詳細については、「SAML IDプロバイダー起点のシングルサインオンを構成する」をお読みください。
これを実装するには、以下を行う必要があります。
  • カスタムログイン経路ハンドラーをアプリケーションに追加します。
  • 以下を許可するようにSAML接続を更新します。
    1. IdP起点のSAML応答の受信を受け付ける
    2. サービスプロバイダー起点の認証要求を送信するデフォルトのアプリケーションにリダイレクトする

仕組み

OIDCアプリケーションフロー図へのIDプロバイダーが開始したSAMLサインイン
  1. ユーザーがSAML IdPのログインエンドポイントに移動します。
  2. SAML IdPがログインページを返します。
  3. ユーザーが資格情報をSAML IdPに送信します。
  4. SAML IdPがユーザーのセッションを作成し、フォームPostとSAML応答のあるHTMLページを返します。
  5. ページがHTTP POST呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。
  6. Auth0テナントがユーザーのブラウザーでOIDCアプリケーションのカスタムログイン経路ハンドラーにリダイレクトし、DトークンをURLフラグメントとして渡します。
  7. ブラウザーがOIDCアプリケーションのカスタムログイン経路ハンドラーを呼び出して、connectionパラメーターとIDトークンを渡します。
  8. OIDCアプリケーションがIDトークンを無視してconnectionパラメーターを解析し、セッションのstateパラメーターを作成してから、ユーザーのブラウザーをAuth0テナントの/authorizeエンドポイントにリダイレクトします。
  9. ブラウザーがAuth0テナントの/authorizeエンドポイントを呼び出して、提供されたconnectionstateのパラメーターを渡します。
  10. Auth0テナントがSAMLログイン要求を生成し、ユーザーのブラウザーをSAML IdPのログインエンドポイントにリダイレクトします。
  11. ブラウザーがSAMLログイン要求をSAML IdPのログインエンドポイントに送信します。
  12. SAML IdPがユーザーのセッションを見つけて、フォームPostとSAML応答のあるHTMLページを返します。
  13. ページがHTTP POST呼び出しを行って、自動的にSAML応答をAuth0テナントに送信します。
  14. Auth0テナントがユーザーのブラウザーをアプリケーションのログイン経路ハンドラーにリダイレクトします。
  15. ブラウザーばアプリケーションのログイン経路ハンドラーを呼び出して、提供されたstateパラメーターとIDトークンを渡します。
  16. OIDCアプリケーションがstateパラメーターを検証して、IDトークンを解析し、ユーザーにアプリケーションセッションを作成します。

カスタムログイン経路ハンドラーを作成する

カスタムログイン経路ハンドラーはアプリケーションのログインメソッドを呼び出します。ハンドラーはconnectionパラメーターを受け付けて、Auth0テナントに送信する認証要求に含めます。 カスタムログイン経路ハンドラーに関係付けるエンドポイントは、標準のログイン経路ハンドラーに関係付けているものとは別にすることをお勧めします。たとえば、標準のログイン経路ハンドラーを/loginエンドポイントと関連付けている場合には、カスタムログイン経路ハンドラーを/startloginエンドポイントと関連付けます。
Auth0 SDKを認証の処理に使用していない場合には、CSRF攻撃から保護するために、アプリケーションのログインメソッドがstateパラメーター値を/authorizeエンドポイントに渡し、IDプロバイダーからの応答でstateパラメーターを検証しなければなりません。詳しくは、「OAuth 2.0の状態パラメーターを使って攻撃を防ぎ、ユーザーをリダイレクトする」をお読みください。

Auth0 Single Page App SDKを使用している場合には、カスタムログイン経路ハンドラーを追加して、ログインメソッドを更新し、以下のように接続パラメーターに対応させることができます。
const router = {
  "/": () => showContent("content-home"),
  "/profile": () =>
    requireAuth(() => showContent("content-profile"), "/profile"),
  "/login": () => login(),
  "/startlogin": () => startlogin()
};

//new method to start login from idp-initiated callback
const startlogin = async () => {
  console.log(window.location.href)
  let myURL = new URL(window.location.href);
  let conn = myURL.searchParams.get("connection");
  return  login(null, conn);
}

/**
 * Starts the authentication flow
 */
const login = async (targetUrl, connection) => {
  try {
    console.log("Logging in", targetUrl);

    const options = {
      redirect_uri: window.location.origin,
    };

    if (connection) {
      options.connection = connection;
    }

    if (targetUrl) {
      options.appState = { targetUrl };
    }

    await auth0.loginWithRedirect(options);
  } catch (err) {
    console.log("Log in failed", err);
  }
};

クエリ文字列を作成する

クエリ文字列にはredirect_uriパラメーターを含めます。パラメーターの値はURLエンコードされ、以下で構成されなければなりません。
  1. カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイント
  2. SAML接続名の値が指定されたconnectionパラメーター

アプリケーションのエンドポイントがhttps://exampleco.com/startloginでSAML接続名がmy-saml-connectionの場合、クエリ文字列はredirect_uri=https%3A%2F%2Fexampleco.com%2Fstartlogin%3Fconnection%3Dmy-saml-connectionになります。

アプリケーションを構成する

  1. [Auth0 Dashboard]>[Applications(アプリケーション)]>[Application(アプリケーション)]に移動します。
  2. Auth0にあるOIDCアプリケーションを表す新しいアプリケーションを作成します。
  3. [Allowed Callback URL(許可されているコールバックURL)] に、カスタムログイン経路ハンドラーに関連付けられているアプリケーションのエンドポイントを含めて更新します。

接続を構成する

  1. [Auth0Dashboard]>[Authentication(認証)]>[Enterprise(エンタープライズ)]>[SAML]に移動します。
  2. 新しいSAML接続を作成します。
  3. [IdP-Initiated SSO(IdP起点のSSO)] ビューに切り替えます。
  4. [Accept Requests(要求を許可する)] を選択します。
  5. [Default Application(デフォルトのアプリケーション)] に、先ほど作成したアプリケーションを選択します。
  6. [Response Protocol(応答プロトコル)][OpenID Connect] を選択します。
  7. [Query String(クエリ文字列)] に、先ほど作成したクエリ文字列を入力します。

もっと詳しく

I