Skip to content

SSO 設定の追加方法

概要

顧客が SSO(Single Sign-On)を契約した際に、ユーザーが SSO 機能を利用できるようにするために必要な設定手順を説明します。この手順は、顧客の Identity Provider (IdP) を AWS Cognito と連携させ、アプリケーションで SSO ログインを有効化するためのものです。

前提条件

  • AWS Cognito User Pool への管理者アクセス権限
  • App Config への編集権限
  • 顧客から提供される IdP の設定情報(Microsoft Entra ID、Google Workspace など)
  • 対象環境(dev、staging、production)の確認

手順

1. Cognito 上で IdP の追加

  1. AWS Cognito コンソールにアクセス

    • 対象の User Pool を選択
    • 左メニューから「認証>ソーシャルプロバイダーと外部プロバイダー」を選択
  2. Identity Provider の追加

    • プロバイダータイプを選択(例:SAML、OIDC)
    • プロバイダー名を設定(例:MicrosoftEntra-ZipunkTest
    • 識別子は顧客のドメイン名を使用(例:zipunk.onmicrosoft.com
    • メタデータは顧客から提供されるファイルをアップロード
    • SP が開始する SAML アサーションが必要 を選択
    • 署名などは希望があれば設定する

custom:useremail ではなく、custom:idp-email を使用することに注意してください。 設定例

  1. 属性マッピングの設定
    • custom:idp-email
    • family_name
    • given_name

2. Cognito クライアントの作成

以下の設定でアプリケーションクライアントを作成します。

設定例

  1. 基本設定

    • アプリケーションクライアント名: quden-prod-[顧客名]-sso-client
    • 認証フローセッションの持続期間: 3分
    • 更新トークンの有効期限: 365日
    • アクセストークンの有効期限: 60分
    • IDトークンの有効期限: 1日
  2. 認証フロー設定

    • 「サーバー側の管理者認証情報」を選択
    • 高度な認証設定で「ユーザー存在エラーの防止を有効化」
  3. Redirect URL の設定

    text
    https://app.quden.io
    https://app.quden.io/signin/sso/callback
  4. 追加した IdP の紐づけ

    • 「Identity providers」タブで先ほど作成した IdP を選択
  5. スコープ

    • openid
    • email
    • profile

3. App Config 内での Feature Flags 設定

App Config の設定ファイルに以下の JSON を追加します:

json
{
    "IS_SSO_AVAILABLE": {
        "enabled": true,
        "configMap": {
            "[顧客のドメイン]": {
                "clientId": "<cognito-client-id>",
                "clientSecret": "<cognito-client-secret>",
                "idpIdentifier": "[顧客のドメイン]",
                "userPoolDomain": "auth.[環境].quden.io",
                "logoutRedirectUri": "https://app.[環境].quden.io/signin",
                "providerName": "MicrosoftEntra-[顧客名]"
            }
        }
    }
}

設定項目の説明

  • clientId: Cognito クライアントの ID
  • clientSecret: Cognito クライアントのシークレット
  • idpIdentifier: 顧客のドメイン(例:zipunk.onmicrosoft.com
  • userPoolDomain: 認証用のドメイン
  • logoutRedirectUri: ログアウト後のリダイレクト先
  • providerName: Cognito で設定した IdP の名前

4. 設定の検証

  1. Cognito 設定の確認

    • Test authentication で IdP との接続をテスト
    • 属性マッピングが正しく設定されているかを確認
  2. アプリケーションでのテスト

    • SSO ログインボタンが表示されることを確認
    • 実際のログインフローをテスト
    • ユーザー情報が正しく取得されることを確認

設定例

Microsoft Entra ID の場合

json
{
    "IS_SSO_AVAILABLE": {
        "enabled": true,
        "configMap": {
            "example.onmicrosoft.com": {
                "clientId": "2ia3nmuse73rklu6porec9j6bd",
                "clientSecret": "xxxxxxxxxxxxxxxxxxxxx",
                "idpIdentifier": "example.onmicrosoft.com",
                "userPoolDomain": "auth.dev.quden.io",
                "logoutRedirectUri": "https://app.dev.quden.io/signin",
                "providerName": "MicrosoftEntra-ExampleCorp"
            }
        }
    }
}

トラブルシューティング

よくある問題と解決方法

  1. 認証が失敗する

    • IdP の設定情報(メタデータURL、証明書など)を再確認
    • 属性マッピングが正しく設定されているかを確認
    • Cognito のログを確認
  2. リダイレクトURLエラー

    • Cognito クライアントの Redirect URL 設定を確認
    • IdP 側の Redirect URL 設定も確認
  3. ユーザー情報が取得できない

    • 属性マッピングの設定を確認
    • IdP から送信される属性名を確認
  4. App Config の設定が反映されない

    • JSON の構文エラーがないかを確認
    • デプロイが正常に完了しているかを確認
    • キャッシュのクリアが必要な場合があります

セキュリティ考慮事項

  • Client Secret は安全に管理し、定期的にローテーション
  • 最小権限の原則に従い、必要最小限のスコープのみを設定
  • ログイン試行回数の制限を設定
  • 定期的なアクセスログの監査

関連リンク

SP Metadata

xml
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
                     validUntil="2025-07-19T09:50:35Z"
                     cacheDuration="PT604800S"
                     entityID="urn:amazon:cognito:sp:ap-northeast-1_tR0nnRpLX">
    <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
        <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
        <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                                     Location="https://auth.quden.io/saml2/idpresponse"
                                     index="1" />
        
    </md:SPSSODescriptor>
    <md:Organization>
       <md:OrganizationName xml:lang="en-US">Quden</md:OrganizationName>
       <md:OrganizationDisplayName xml:lang="en-US">Quden</md:OrganizationDisplayName>
       <md:OrganizationURL xml:lang="en-US">https://quden.io</md:OrganizationURL>
    </md:Organization>
    <md:ContactPerson contactType="support">
        <md:GivenName>Quden Customer Support</md:GivenName>
        <md:EmailAddress>support@quden.io</md:EmailAddress>
    </md:ContactPerson>
</md:EntityDescriptor>