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

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

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

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 data-tooltip-id="react-containers-DefinitionTooltip-1" href="/docs/ja-jp/glossary?term=security-assertion-markup-language" tip="Security Assertion Markup Language（SAML）: パスワードなしに二者間で認証情報を交換できる標準化プロトコル。" cta="用語集の表示">SAML</Tooltip>フェデレーションをセットアップする手順の多くは、サービスプロバイダーによって開始されるシングルサインオン（<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=single-sign-on" tip="シングルサインオン（SSO）: ユーザーが1つのアプリケーションにログインした後、そのユーザーを他のアプリケーションに自動的にログインさせるサービス。" cta="用語集の表示">SSO</Tooltip>）から始まります。サービスプロバイダーは、認証の目的でユーザーをIDプロバイダー（<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=idp" tip="IDプロバイダー（IdP）: デジタルIDを保存および管理するサービス。" cta="用語集の表示">IdP</Tooltip>）にリダイレクトします。このプロセスは、消費者向けのシナリオでよく使用されます。

ただし、エンタープライズのシナリオでは、サービスプロバイダーではなくIdPによってSSOが開始されることが一般的です。たとえば、エンタープライズは、ユーザーがポータルにサインオンした後に正しいアプリケーションに移動できるようにポータルをセットアップする場合があります。

## リスクと検討事項

IdP起点フローにはセキュリティリスクがあるため、お勧めできません。可能な限り、SP起点フローの使用をお勧めします。

IdP起点SSOを有効にする前に、必ずリスクについて理解しておいてください。このシナリオでは、Auth0がIdPから一方的な応答を受信し、アプリケーションがAuth0から一方的な応答を受信します。どちらのエンティティも、ユーザーがフローを開始したことを確認できません。このため、このフローを有効にすると、[ログインCSRF攻撃](https://support.detectify.com/support/solutions/articles/48001048951-login-csrf)にさらされる可能性が高まり、攻撃者は正当なユーザーをだまして、攻撃者のIDを使って無意識のうちにアプリケーションにログインさせることができます。

### OpenID ConnectのIdP起点フロー

<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=openid" tip="OpenID: アプリケーションがログイン情報を収集および保存することなくにユーザーのIDを検証できるようにする認証用のオープン標準。" cta="用語集の表示">OpenID</Tooltip> Connect（OIDC）は、IdP起点フローの概念をサポートしていません。そのため、Auth0は、（SAML接続からの）SAML IdP起点フローをアプリケーションのOIDC応答に変換できる機能を提供しますが、OIDC/OAuth2プロトコルを適切に実装しているアプリケーションは要求されていない応答を拒否します。

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

複数のIdPを使用する場合は、ログインエンドポイントがIDプロバイダーに固有であるか、ワークフローを開始するIdPを識別するパラメーターを受け入れられることを確認してください。

別のアプローチとして、ユーザーがアプリケーションでログインフローを開始することもできます。

### ポストバックURL

IdP起点SSOを使用する場合は、必ずポストバックURLに接続パラメーターを含めてください。

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

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

[Organizations](https://auth0.com/docs/manage-users/organizations)機能を使用している場合は、必要に応じて、目的の組織の組織IDを含む、次の組織パラメーターを含めることもできます。

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

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

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  ユーザーがこの方法でログインするためには、Organizationに対して接続が有効化されていなければなりません。また、有効な接続で[auto-membership](https://auth0.com/docs/manage-users/organizations/configure-organizations/grant-just-in-time-membership)が構成されているか、ユーザーがそのOrganizationのメンバーでなければなりません。
</Callout>

### Lock/Auth0.js

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

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

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

Lockを使用する場合は、コンストラクターに送信されるオプションのパラメーターを使用してフラグを含めることができます。

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

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

`var options = { _enableIdPInitiatedLogin: true
};`

`enableIdPInitiatedLogin`フラグの前に、Lockで使用する場合は1つのアンダースコア、auth0.jsライブラリーで使用する場合は2つのアンダースコアがそれぞれ付くことに注意してください。

## IDP起点SSOをセットアップする

1. [［Dashboard］>［Authentication（認証）］>［Enterprise（エンタープライズ）］](https://manage.auth0.com/#/connections/enterprise)の順に移動し、 **［SAMLP Identity Provider（SAMLP IDプロバイダー）］** を選択します。
2. **［Settings（設定）］** で、IdP起点SSOの構成を確認できます。

   <Frame>
     <img src="https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/ja-jp/cdy7uua7fh8z/1HORCAp4fZQg0BOoIopvoS/11f3b6071383ddc6967c40138d5d1794/2025-01-28_13-46-21.png" alt="プロトコル - IdP起点SSOの構成画面" />
   </Frame>

* **IdP-initiated SSO Behavior（IdP起点SSOの動作）** ：このオプションを使用すると、SAML接続に対してIdP起点のログインを有効にすることができます。 **［Accept Requests（要求を受け入れる）］** を選択し、すべての必須フィールドに値を入力します。
* **Default Application（デフォルトのアプリケーション）** ：IdP起点のログインが成功すると、これがユーザーをルーティングするアプリケーションとなります。この設定には、この接続で有効になっている利用可能なアプリケーションが表示されます。IdP起点でユーザーにログインさせるアプリケーションをドロップダウンから選択します。1つのSAML接続につき、IdP起点のログインに対して選択できるアプリケーションは1つだけです。
* **Response Protocol（応答プロトコル）** ：これは、選択した **デフォルトのアプリケーション** の接続に使用するプロトコルです。通常、アプリケーションはOpenID Connectプロトコルを使って構成されます（上記を参照）。ただし、アプリケーションにSAML2 Webアプリアドオンを構成しており、SAMLアサーションをルーティングしたい場合は、SAMLを選択する必要があります。有効なSAMLアサーションがポストバックURLに渡されると、Auth0は、選択された応答プロトコルを使用して、構成されたデフォルトのアプリケーションの最初に許可されたコールバックURLにログイン応答を送信します。OIDCを使用する場合、クエリ文字列フィールドを使用してこのプロトコルを変更し、`redirect_uri`を指定することができます。
* **Query String（クエリ文字列）** ：クエリ文字列のオプションは、OpenID Connectプロトコルが使用されるときの動作をカスタマイズするのに役立ちます。[クエリ文字列](https://en.wikipedia.org/wiki/Query_string)を使用して、パラメーターの設定に類似した複数のオプションを設定することができます。以下のように設定できます。

  \| 設定 | 説明 |
  \| --- | --- |
  \| `redirect_uri` | IdP起点のログインが完了したら、要求がアプリケーションの\_\_Allowed Callback URLs（許可されているCallback URL）\_\_にリスト表示されている最初のURLにリダイレクトされます。ただし、`redirect_uri`を設定している場合、IdPはこのURLにリダイレクトします。これにより、ワイルドカードを使用する設定されたサブドメインスキームがあり、ある特定のサブドメインのみにリダイレクトしたい場合などのケースに柔軟性を追加します。 |
  \| `scope` | 送信されたIDトークンのスコープを定義します。複数のスコープを設定できます。 |
  \| `response_type` | SPAの暗黙付与フローのトークンを設定します。通常のWebアプリに対して認証コード付与フローのコードを設定できます。 |

  <Warning>
    IdP起点フローでは、Callback URLのドメインが未検証の場合、Auth0サーバーはトークンにあるスコープを削除します。Auth0で未検証のドメインとして定義されているのは、`localhost`と[127.0.0.1](http://127.0.0.1/)のみです。どちらかをCallback URLとして使用すると、`/userinfo`エンドポイントからのトークンは空の応答を返します。要求したスコープのあるトークン応答を取得するには、検証済みのドメインを使用します。
  </Warning>

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

## 100に制限されているアプリケーションドロップダウンリスト

IdP起点SSOでアプリケーションを **Default Application（デフォルトのアプリケーション）** として選択する場合で、かつそのアプリケーションがテナントのドロップダウンリストの最初の100個のアプリケーションに含まれていない場合は、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>を使用してそのアプリケーションを選択する必要があります。パッチを実行する必要があります。

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

## もっと詳しく

* [証明書やキーの文字列表現で作業する](/docs/ja-jp/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)
