> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> SAML IDプロバイダー起点のシングルサインオン（SSO）を設定する方法について説明します。

# SAML IDプロバイダー起点のシングルサインオンを設定する

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

<Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで2者間の認証情報の交換を可能にする標準化されたプロトコル。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=SAML">SAML</Tooltip>フェデレーションの設定手順の多くは、サービスプロバイダーが開始する<Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで2者間の認証情報の交換を可能にする標準化されたプロトコル。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Single+Sign-on">シングルサインオン</Tooltip> (SSO) から始まります。サービスプロバイダーは、認証のためにユーザーを<Tooltip tip="Single Sign-On (SSO): ユーザーが1つのアプリケーションにログインした後、他のアプリケーションにも自動的にログインさせるサービス。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=identity+provider">アイデンティティプロバイダー</Tooltip> (IdP) にリダイレクトします。このプロセスは、一般にコンシューマー向けのシナリオで使われます。

ただし、エンタープライズのシナリオでは、サービスプロバイダーではなく、IdP が SSO を開始するケースから始めることも少なくありません。たとえば、企業がポータルを用意し、ユーザーがそのポータルにサインオンした後に正しいアプリケーションへ移動できるようにする場合です。

<div id="risks-and-considerations">
  ## リスクと注意事項
</div>

IdP 主導 フローにはセキュリティ上のリスクがあるため、推奨されません。可能な限り、SP-Initiated フローを使用することを推奨します。

IdP 主導 SSO を有効にする前に、リスクを十分に理解してください。このシナリオでは、Auth0 は IdP からの未承諾のレスポンスを受け取り、アプリケーションは Auth0 からの未承諾のレスポンスを受け取ります。どちらも、ユーザー自身がそのフローを開始したことを確認できません。そのため、このフローを有効にすると、攻撃者が正当なユーザーをだまして、攻撃者のアイデンティティで気付かないうちにアプリケーションへログインさせる [Login CSRF attack](https://support.detectify.com/support/solutions/articles/48001048951-login-csrf) を受けるおそれがあります。

<div id="openid-connect-idp-initiated-flow">
  ### OpenID Connect の IdP 起点フロー
</div>

<Tooltip tip="OpenID: アプリケーションがログイン情報を収集・保存しなくても、ユーザーのアイデンティティを検証できるようにする認証のオープン標準。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=OpenID">OpenID</Tooltip> Connect (OIDC) は、IdP 起点フローという考え方をサポートしていません。したがって、Auth0 では SAML IdP 起点フロー (SAML 接続からのフロー) をアプリケーション向けの OIDC レスポンスに変換できますが、OIDC/OAuth 2.0 プロトコルを適切に実装しているアプリケーションは、要求していないレスポンスを拒否します。

OIDC アプリケーションを使用する場合は、アプリケーションにログイン エンドポイントを作成するのが最善です。このエンドポイントの唯一の目的は、IdP (Auth0 テナント) へのリダイレクトを開始することです。

複数の IdP を使用する場合は、ログイン エンドポイントをアイデンティティプロバイダーごとに用意するか、どの IdP がワークフローを開始したのかを識別するためのパラメーターを受け取れるようにしてください。

別の方法として、ユーザーがアプリケーション側からログインを開始するようにすることもできます。

<div id="post-back-url">
  ### Post-back URL
</div>

IdP 主導 SSO を使用する際は、Post-back URL に `connection` パラメーターを必ず含めてください。

export const codeExample1 = `https://{yourDomain}/login/callback?connection={yourConnectionName}`;

<AuthCodeBlock children={codeExample1} language="http" />

[Organizations](/docs/ja-jp/manage-users/organizations)機能を使用している場合は、必要に応じて、対象の組織の組織IDを含む organization パラメーターを指定できます:

export const codeExample2 = `https://{yourDomain}/login/callback?connection={yourConnectionName}&organization={yourCustomersOrganizationId}`;

<AuthCodeBlock children={codeExample2} language="http" />

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  この方法でユーザーが正常にログインするには、対象の接続がその組織で有効になっている必要があります。さらに、有効にした接続に対して[自動メンバーシップ](/docs/ja-jp/manage-users/organizations/configure-organizations/grant-just-in-time-membership)を設定するか、ユーザーがその組織のメンバーシップを持っていることを確認する必要があります。
</Callout>

<div id="lockauth0js">
  ### Lock/Auth0.js
</div>

認証結果の処理に Lock または Auth0.js を使用するシングルページアプリケーションの場合、IdP 主導フローを許可し、その結果としてアプリケーションが Login CSRF 攻撃を受ける可能性があることを、明示的に指定する必要があります。

Auth0.js を使用している場合は、ライブラリの `webAuth.parseHash` を更新し、フラグ `__enableIdPInitiatedLogin` を `true` に設定する必要があります。

```javascript lines theme={null}
var data = webAuth.parseHash(
      {
        ...
        __enableIdPInitiatedLogin: true
        ...
      }
```

Lock を使用している場合は、コンストラクターに渡す options パラメーターでこのフラグを指定できます。

`const lock = new Auth0Lock(clientID, domain, options)`

フラグ自体は次のとおりです。

`var options = { _enableIdPInitiatedLogin: true };`

`enableIdPInitiatedLogin` フラグは、Lock で使用する場合は先頭にアンダースコアが 1 つ付き、auth0.js ライブラリで使用する場合はアンダースコアが 2 つ付く点に注意してください。

<div id="set-up-idp-initiated-sso">
  ## IDP-initiated SSO を設定する
</div>

1. [Dashboard > Authentication > Enterprise](https://manage.auth0.com/#/connections/enterprise) に移動し、**SAMLP Identity Provider** を選択します。
2. **設定** で、IdP 主導 SSO の構成を確認できます。

   <Frame>
     <img src="https://mintcdn.com/translations/eVsQcTnbClN-oB7d/docs/images/cdy7uua7fh8z/1HORCAp4fZQg0BOoIopvoS/0009d4b5f405c2436af5729d52a3867d/2025-01-28_13-47-26.png?fit=max&auto=format&n=eVsQcTnbClN-oB7d&q=85&s=a1b34df487e00d763e5ae8e760e4779a" alt="Protocols IdP-initiated SSO Configuration Screen" width="1072" height="961" data-path="docs/images/cdy7uua7fh8z/1HORCAp4fZQg0BOoIopvoS/0009d4b5f405c2436af5729d52a3867d/2025-01-28_13-47-26.png" />
   </Frame>

* **IdP-initiated SSO Behavior**: このオプションでは、SAML 接続での IdP 主導 ログインを有効にできます。**Accept Requests** を選択し、必要なフィールドをすべて入力します。
* **Default Application:** IdP 主導 ログインが成功すると、ユーザーはこのアプリケーションに送られます。この設定には、この接続で有効になっている利用可能なアプリケーションが表示されます。ユーザーに IdP 主導 でログインさせるアプリケーションをドロップダウンから選択します。SAML 接続ごとに、IdP 主導 ログイン用に選択できるアプリケーションは 1 つだけです。
* **Response Protocol:** これは、選択した **Default Application** に接続するために使用されるプロトコルです。通常、アプリケーションは OpenID Connect プロトコルで構成されています (上記を参照) 。ただし、アプリケーションに SAML2 Web App アドオンを構成していて、SAML アサーションをルーティングしたい場合は、SAML を選択する必要があります。有効な SAML Assertion が postback URL に渡されると、Auth0 は選択したレスポンスプロトコルを使って、構成済みのデフォルトアプリケーションの最初の許可済みコールバック URL にログインレスポンスを送信します。OIDC を使用している場合は、クエリ文字列フィールドで `redirect_uri` を指定することで、これを変更できます。
  * アプリケーションに構成されたコールバック URL に 複数のカスタムドメイン (MCD) のプレースホルダーが含まれている場合、システムは、IdP からの最初のリクエストを受信した postback URL のカスタムドメインに対応するメタデータ値を使って、その値を動的に設定します。詳しくは、[Multiple Custom Domains](/docs/ja-jp/customize/custom-domains/multiple-custom-domains) を参照してください。
* **Query String:** OpenID Connect プロトコルを使用する場合、クエリ文字列オプションを使って動作をカスタマイズできます。[query string](https://en.wikipedia.org/wiki/Query_string) でパラメーターを設定するのと同じように、複数のオプションを指定できます。設定できる内容は次のとおりです。

| 設定              | 説明                                                                                                                                                                                                                    |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `redirect_uri`  | IdP 主導 ログインが完了すると、リクエストはアプリケーションの **Allowed Callback URLs** に一覧表示されている最初の URL にリダイレクトされます。ただし、`redirect_uri` を設定すると、IdP はこの URL にリダイレクトします。これにより、ワイルドカードを使った固定のサブドメイン構成があり、特定の 1 つのサブドメインにだけリダイレクトしたい場合などにも柔軟に対応できます。 |
| `scope`         | 送信される ID トークンのスコープを定義します。複数のスコープを設定できます。                                                                                                                                                                              |
| `response_type` | SPA 用の Implicit Grant Flow では token を設定できます。regular web apps 用の Authorization Code Grant Flow では code を設定できます。                                                                                                        |

<Warning>
  IdP 主導 フローでは、コールバック URL が未検証のドメインである場合、Auth0 サーバーはトークン内のスコープを削除します。Auth0 では、未検証のドメインとして `localhost` と [127.0.0.1](http://127.0.0.1/) だけを定義しています。これらのいずれかをコールバック URL として使用すると、`/userinfo` エンドポイントからのトークンは空のレスポンスを返します。リクエストしたスコープを含むトークンレスポンスを取得するには、検証済みドメインを使用してください。
</Warning>

クエリ文字列の例:
`redirect_uri=https://jwt.io&scope=openid email&response_type=token`

<div id="application-drop-down-list-limited-to-100">
  ## アプリケーションのドロップダウンリストは100件までに制限されています
</div>

IdP 主導 SSO で **Default Application** としてアプリケーションを選択する場合、そのアプリケーションがテナントのドロップダウンリストの先頭100件に含まれていなければ、<Tooltip tip="Management API: お客様が管理タスクを実行できるようにする製品です。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Management+API">Management API</Tooltip> を使用してそのアプリケーションを選択する必要があります。PATCH を実行する必要があります:

```json lines theme={null}
{
"options": {
"signInEndpoint": "yourIdpSignInUrl",
"idpinitiated": {
"client_id": "yourClientId",
"client_protocol": "saml",
"client_authorizequery": ""
},
"signingCert": "[copied-from-GET]"
}
}
```

<div id="learn-more">
  ## 詳細はこちら
</div>

* [証明書とキーをString形式で扱う](/docs/ja-jp/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)
