メインコンテンツへスキップ
Auth0 には、 起点の (IdP) レスポンスを、アプリケーション向けの Connect (OIDC) レスポンスに変換する方法があります。 OIDC プロトコルは IdP 起点の認証フローをサポートしていませんが、この方法を使うと、フォーム POST を使用する Implicit Flow によって IdP 起点の認証フローをシミュレートできます。
ログインフローは IdP ではなく OIDC アプリケーションから開始することを強くお勧めします。詳しくは、SAML IDプロバイダー起点のシングルサインオンを設定する を参照してください。
この方法を実装するには、次の対応が必要です。
  • アプリケーションにカスタムのログインルートハンドラーを追加します。
  • SAML 接続を次のように更新します。
    1. 受信した IdP 起点の SAML レスポンスを受け入れる。
    2. SP 起点の認証リクエストを送信するデフォルトのアプリケーションにリダイレクトする。

仕組み

IDプロバイダー起点の SAML サインインから OIDC アプリケーションへのフロー図
  1. ユーザーが SAML IdP のログインエンドポイントにアクセスします。
  2. SAML IdP がログインページを返します。
  3. ユーザーが認証情報を SAML IdP に送信します。
  4. SAML IdP はユーザーのセッションを作成し、Form Post と SAML レスポンスを含む HTML ページを返します。
  5. ページは HTTP POST 呼び出しによって、SAML レスポンスを Auth0 テナントに自動送信します。
  6. Auth0 テナントは、IDトークンを URL フラグメントとして付加し、ユーザーのブラウザーを OIDC アプリケーションのカスタムログインルートハンドラーにリダイレクトします。
  7. ブラウザーは、connection パラメーターと IDトークンを指定して、OIDC アプリケーションのカスタムログインルートハンドラーを呼び出します。
  8. OIDC アプリケーションは IDトークンを無視し、connection パラメーターを解析し、セッション用の state パラメーターを作成したうえで、ユーザーのブラウザーを Auth0 テナントの /authorize エンドポイントにリダイレクトします。
  9. ブラウザーは、指定された connection パラメーターと state パラメーターを使用して、Auth0 テナントの /authorize エンドポイントを呼び出します。
  10. Auth0 テナントは SAML ログインリクエストを生成し、ユーザーのブラウザーを SAML IdP のログインエンドポイントにリダイレクトします。
  11. ブラウザーは SAML ログインリクエストを SAML IdP のログインエンドポイントに送信します。
  12. SAML IdP はユーザーのセッションを見つけ、Form Post と SAML レスポンスを含む HTML ページを返します。
  13. ページは HTTP POST 呼び出しによって、SAML レスポンスを Auth0 テナントに自動送信します。
  14. Auth0 テナントは、ユーザーのブラウザーをアプリケーションのログインルートハンドラーにリダイレクトします。
  15. ブラウザーは、指定された state パラメーターと IDトークンを指定して、アプリケーションのログインルートハンドラーを呼び出します。
  16. OIDC アプリケーションは state パラメーターを検証し、IDトークンを解析して、ユーザーのアプリケーションセッションを作成します。

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

カスタムログインルートハンドラーは、アプリケーションのログインメソッドを呼び出します。このハンドラーは connection パラメーターを受け取り、それを Auth0 テナントに送信する認証リクエストに含める必要があります。 カスタムログインルートハンドラーは、標準のログインルートハンドラーとは別のエンドポイントに関連付けることをお勧めします。たとえば、標準のログインルートハンドラーが /login エンドポイントに関連付けられている場合は、カスタムログインルートハンドラーを /startlogin エンドポイントに関連付けることができます。
認証の処理に Auth0 SDK を使用していない場合は、CSRF 攻撃を防ぐために、アプリケーションのログインメソッドが /authorize エンドポイントに state パラメーター値を渡し、IDプロバイダーからのレスポンスに含まれる state パラメーターを検証する必要があります。詳細については、OAuth 2.0 の state パラメーターで攻撃を防ぎ、ユーザーをリダイレクトするを参照してください。

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

//IdP起点のコールバックからログインを開始する新しいメソッド
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);
}

/**
 * 認証フローを開始する
 */
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 > Applications に移動します。
  2. Auth0 で OIDC アプリケーションを表す新しい Application を作成します。
  3. Allowed Callback URLs を更新し、カスタムログインルートハンドラーに対応するアプリケーションエンドポイントを追加します。

接続を設定する

  1. Auth0 Dashboard > Authentication > Enterprise > SAML に移動します。
  2. 新しい SAML 接続を作成します。
  3. IdP-Initiated SSO ビューに切り替えます。
  4. Accept Requests を選択します。
  5. Default Application で、事前に作成したアプリケーションを選択します。
  6. Response Protocol で、OpenID Connect を選択します。
  7. Query String に、事前に作成したクエリ文字列を入力します。

詳細情報