SAML を使用したユーザーのログイン

このドキュメントでは、Identity Platform を使用して Security Assertion Markup Language(SAML)2.0 プロバイダでユーザーのログインを行う方法について説明します。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Identity Platform を有効にして、クライアント SDK をアプリに追加します。その方法については、クイックスタートをご覧ください。

プロバイダの構成

  1. Cloud Console で [ID プロバイダ] ページに移動します。
    [ID プロバイダ] ページに移動

  2. [プロバイダを追加] をクリックし、リストから [SAML] を選択します。

  3. 次の詳細情報を入力します。

    1. プロバイダの名前。プロバイダ ID と同じでも、カスタム名でも構いません。カスタム名を入力する場合は、[プロバイダ ID] の横にある [編集] をクリックして ID を指定します(saml. で始める必要があります)。

    2. プロバイダの [エンティティ ID]。

    3. プロバイダの [SAML SSO の URL]。

    4. プロバイダのトークン署名に使用される証明書。必ず開始文字列と終了文字列を含めてください。例:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. サービス プロバイダ でアプリの [エンティティ ID] を入力します。これは通常、アプリの URL です。SAML ID プロバイダでは、これはオーディエンスと呼ばれます。

  5. [承認済みドメイン] のリストにアプリを追加します。たとえば、アプリのログイン URL が https://example.com/login の場合、example.com を追加します。

  6. 必要に応じて、アプリのコールバック URL をカスタマイズします。これは一般に、SAML ID プロバイダでは ACS URL(Assertion Consumer Service URL)と呼ばれます。

    デフォルトのコールバック URL を使用すると、SAML レスポンスを検証する複雑さが軽減されます。このフローをカスタマイズする場合は、プロジェクトの Identity Platform コールバック URL が SAML ID プロバイダで構成されていることを確認してください。通常は、https://<authDomain>/__/auth/handler のような形式になります。詳しくは、認証ハンドラのカスタマイズをご覧ください。

  7. [保存] をクリックします。

署名リクエスト

認証リクエストに署名することで、認証リクエストのセキュリティを強化できます。

リクエストに署名するには、まず inboundSamlConfigs.patch() を呼び出し、idp_config.sign_requesttrue に設定して、ID プロバイダの署名付きリクエストを有効にします。

REST

HTTP メソッドと URL:

PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest

JSON 本文のリクエスト:

{
  "idp_config": {
    "sign_request": true
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

 

REST API を使用して署名付きリクエストを有効にする必要があります。Cloud Console や gcloud コマンドライン ツールの使用はサポートされていません。

レスポンスは、SpCertificate の配列を含む InboundSamlConfig オブジェクトです。リクエストの署名を検証できるように、X509 証明書の値を SAML ID プロバイダで構成します。

ユーザーのログイン

ユーザーをログインさせると、クライアント SDK が認証 handshake を処理し、ペイロードに SAML 属性を含む ID トークンを返します。ユーザーがログインして SAML プロバイダから属性を取得するには、次のようにします。

  1. 前のセクションで構成したプロバイダ ID で SAMLAuthProvider インスタンスを作成します。プロバイダ ID の先頭は saml. にする必要があります。

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
    
  2. ログインフローを開始します。ポップアップまたはリダイレクトのいずれかを使用できます。

    ポップアップを表示するには、signInWithPopup() を呼び出します。

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // User is signed in.
        // Identity provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      })
      .catch((error) => {
        // Handle error.
      });
    

    リダイレクト

    ログインページにリダイレクトするには、signInWithRedirect() を呼び出します。

    firebase.auth().signInWithRedirect(provider);
    

    次に、getRedirectResult() を呼び出して、ユーザーがアプリに戻ったときに結果を取得します。

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      }).catch((error) => {
        // Handle error.
      });
    
  3. firebase.sign_in_attributes クレームを使用して、SAML プロバイダに関連付けられているユーザー属性を ID トークンから取得します。ID トークンをサーバーに送信するときに、Admin SDK を使用して必ず検証してください。

現在、クライアント SDK からのサービス プロバイダ主導の SAML フローのみがサポートされています。

ユーザー アカウントのリンク

ユーザーが別の方法(メールアドレスとパスワードなど)を使用してすでにアプリにログインしている場合は、linkWithPopup()linkWithRedirect() を使用して既存のアカウントを SAML プロバイダにリンクできます。例:

const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

// Link with a popup.
firebase.auth().currentUser.linkWithPopup(provider)
    // currentUser.providerData now has an additional entry for this provider.
  }).catch((error) => {
    // Handle error.
  });

ユーザーの再認証

ユーザーのメールアドレスやパスワードの更新などの機密性の高い操作では、ユーザーのログイン後、長時間経過してない必要があります。ユーザーを再ログインさせるには、reauthenticateWithPopup() または reauthenticateWithRedirect() を呼び出します。例:

const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

// Reauthenticate with a popup.
firebase.auth().currentUser.reauthenticateWithPopup(provider)
  .then((result) => {
    // Get the updated ID token.
    return result.user.getIdTokenResult();
  })
  .then((idTokenResult) => {
    // idTokenResult.authTime should be updated to reflect recent sign-in status.
    // idTokenResult.token has the latest ID token.
  })
  .catch((error) => {
    // Handle error.
  });

次のステップ