[AWS CDK] Cognito の OIDC プロバイダに Auth0 を設定
目次
概要
Auth0 を Amazon Cognito ユーザプールのOIDCプロバイダとして設定しAWS CDKで構築した際のメモです。
Auth0
Auth0 アプリケーション作成
まずは、Auth0 Get Started に従い、Auth0のアプリケーションを作成します。
作成後、
- Domain
- Client ID
- Client Secret
が払い出されるので、控えておきます。
Auth0 ユーザ追加
Auth0の検証で利用するユーザを追加します。
User Management > Users からユーザを追加します。
Auth0 Allowed Callback URLs の追加
Cognitoのユーザプール作成後(後述)、Allowed Callback URLs に対して Cognito のコールバックURLを追加します。
https://${cognito-domain}.auth.${region}.amazoncognito.com/oauth2/idpresponse
Cognito手動セットアップ
CDKで実現したい部分をまずは手動でやってみます。
事前準備としてデフォルトの設定でcognitoを構築しておきます。
IDPの設定
まず、Amazon Cognito コンソールを開き、"ユーザープールの管理" を選択します。 その次にユーザープールを選択し、ナビゲーションペインで "ID プロバイダー" を選択します。 そして、"OpenID Connect" を選択し次の項目を入力します。
- プロバイダー名: 任意の名前
- クライアント ID: Auth0で作成したアプリケーションのClientID
- クライアントのシークレット: Auth0で作成したアプリケーションの Client Secret
- 属性のリクエストメソッド: GET
- セットアップ方法: 発行者 URL を通じた自動入力
- 発行者 URL(Issuer): Auth0で作成したアプリケーションのドメインを入力 (例:
https://****.auth0.com
- 属性をマッピング: email = email
アプリケーションクライアントの作成
Amazon Cognito コンソールのユーザプールのタブからアプリケーションの統合を選択し、 アプリケーションクライアントを作成します。
パラメータは次の項目を入力します。
アプリケーションクライアント
- アプリケーションタイプ: パブリッククライアント
- アプリケーションクライアント名: auth0-test
- 認証フロー: ALLOW_CUSTOM_AUTH, ALLOW_USER_SRP_AUTH
※その他はデフォルトの値
ホストされた UI 設定
- 許可されているコールバックURL: 適当な値 (この時点ではhttp://localhost:8080とかで良い)
- IDプロバイダー: 前述したAuth0用IDP
- OpenID 接続スコープ: email,openid,他任意
- OAuth 2.0 権限タイプ: 認証コード付与, 暗黙的な付与
※その他はデフォルトの値
ホストされたUIで検証
ホストされたUIから動作の検証を行うことができます。
アプリケーションの統合から作成したアプリケーションクライアントを選択します。
ホストされたUIのリンクを押下して Hosted UIページに遷移し、アプリケーションクライアント(Auth0)を選択します。
Auth0の検証のために追加したユーザ情報でログインして動作を確認します。
AWS CDK で構築する
ここで本題である AWS CDK を利用してAuth0 + Cognitoの構成を作成していきます。
CDKプロジェクト初期化
まずはプロジェクトを初期化します。
mkdir cdk-cognito-sample
cd cdk-cognito-sample
cdk init app --language=typescript
Auth0アプリケーション作成
手動で作成した時と同様に、アプリケーションを作成します。
スタック更新
スタックを以下のように変更します。
import { aws_cognito as cognito, Stack, StackProps } from 'aws-cdk-lib';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
const getAuth0Idp = (app: Stack, userPool: cognito.UserPool) => {
return new cognito.CfnUserPoolIdentityProvider(
app,
'UserPoolIdentityProvider',
{
providerName: 'auth0-test',
providerType: 'OIDC',
userPoolId: userPool.userPoolId,
providerDetails: {
client_id: '*********', // auth0:client_id
client_secret: '*********', // auth0client_secret
attributes_request_method: 'GET',
oidc_issuer: 'https://*********.auth0.com', // auth0:domain
authorize_scopes: 'email profile openid',
},
attributeMapping: {
email: 'email',
},
},
);
};
export class CdkCognitoSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// 👇 User Pool
const userPool = new cognito.UserPool(this, 'UserPool', {
userPoolName: 'auth0-test-user-pool',
selfSignUpEnabled: true,
signInAliases: {
email: true,
},
autoVerify: {
email: true,
},
passwordPolicy: {
minLength: 6,
requireLowercase: true,
requireDigits: true,
requireUppercase: false,
requireSymbols: false,
},
accountRecovery: cognito.AccountRecovery.EMAIL_ONLY,
removalPolicy: cdk.RemovalPolicy.RETAIN,
});
const userPoolProvider = getAuth0Idp(this, userPool);
userPool.addDomain('domain', {
cognitoDomain: {
domainPrefix: 'auth0-test-202207',
},
});
const userPoolClient = userPool.addClient('client', {
userPoolClientName: 'Auth0UserPoolClient',
generateSecret: false,
oAuth: {
callbackUrls: ['http://localhost:8080/auth/callback'],
logoutUrls: ['http://localhost:8080/auth/logout'],
flows: {
authorizationCodeGrant: true,
implicitCodeGrant: true, // warn:
},
scopes: [
cognito.OAuthScope.EMAIL,
cognito.OAuthScope.OPENID,
cognito.OAuthScope.PROFILE,
],
},
authFlows: {
userSrp: true,
custom: true,
},
supportedIdentityProviders: [
cognito.UserPoolClientIdentityProvider.custom(
userPoolProvider.providerName,
),
],
});
// memo:
// "The provider * does not exist for User Pool *" 対策
// @see https://github.com/aws/aws-cdk/issues/15692
userPoolClient.node.addDependency(userPoolProvider);
}
}
Auth0 Allowed Callback URLs
ドメインが払い出されるので、Auth0のAllowed Callback URLsに追加します。
これで手動作成のケースと同様な環境を作成することができます。
参考にしたサイト
- Auth0 を Amazon Cognito の OIDC プロバイダーとしてセットアップする - Amazon Web Services
- Create Applications - auth0
- Amazon Cognito user poolの外部IdPとしてAzure ADを設定してみた(AWS CDK)
- Auth0 + Cognito IDプールで認証基盤を構築!
- AWS::Cognito::UserPoolIdentityProvider
- (cognito): Race condition when creating an user pool and its identity provider in the same stack #15692