アプリにもよるけど、おおむねこんな感じ
aws cognito-idp sign-up \
--client-id <client-id> \
--username <username> \
--password <password> \
--user-attributes '[{"Name": "email", "Value": "<email-address>"}]' \
--user-pool-id <user-pool-id>
(user-attributesは必須項目にあわせて追加)
で、これだとメールが「認証済み」にならない(email_verifiedがいっぺんに設定できない)ので、
aws cognito-idp admin-update-user-attributes \
--user-pool-id <user-pool-id> \
--username <username> \
--user-attributes '[{"Name": "email_verified", "Value": "true"}]'
sign-up はアプリケーションクライアントIDが引数なのに、 admin-update-user-attributes はプールIDが引数。 変だけど本当。
- sign-up — AWS CLI 2.1.29 Command Reference
- admin-update-user-attributes — AWS CLI 2.9.19 Command Reference
AWS::Cognito::UserPoolClient - AWS CloudFormation のところの機械翻訳(+若干人間)
ユーザープールクライアントにサポートさせたい認証フロー。 ユーザープールの各アプリクライアントでは、 ユーザー名とセキュアリモートパスワード(SRP)、 ユーザー名とパスワード、 Lambda関数で定義するカスタム認証プロセスなど、 1つ以上のフローの任意の組み合わせでユーザーにサインインすることができます。
注意
ExplicitAuthFlowsに値を指定しない場合、ユーザークライアントはALLOW_REFRESH_TOKEN_AUTH、
ALLOW_USER_SRP_AUTH、
ALLOW_CUSTOM_AUTH
をサポートします。
有効な値は以下の通り。
- ALLOW_ADMIN_USER_PASSWORD_AUTH : 管理者ベースのユーザーパスワード認証フローADMIN_USER_PASSWORD_AUTHを使用可能にします。この設定は、昔 ADMIN_NO_SRP_AUTH と言われていたものと同じです。 この認証フローでは、アプリは、パスワードを安全に送信するためにセキュアリモートパスワード(SRP)プロトコルを使用する代わりに、 リクエスト内でAmazon Cognitoにユーザー名とパスワードを渡します。
- ALLOW_CUSTOM_AUTH : Lambdaトリガーベースの認証を有効にします。
- ALLOW_USER_PASSWORD_AUTH : ユーザーパスワードベースの認証を有効にします。 このフローでは、Amazon Cognitoは、SRPプロトコルを使用してパスワードを検証する代わりに、リクエストでパスワードを受信します。
- ALLOW_USER_SRP_AUTH : SRP ベースの認証を有効にします。
- ALLOW_REFRESH_TOKEN_AUTH : authflowがトークンをリフレッシュすることを有効にします。
環境によっては、 ADMINNO_SRP_AUTH、 CUSTOM_AUTH_FLOW_ONLY、 またはUSER_PASSWORD_AUTH という値が表示されることがあります。 これらのレガシーな ExplicitAuthFlows の値を、 ALLOW_USER_SRP_AUTHのようにALLOWで始まる値と同時にユーザープールクライアントに割り当てることはできません。
Secure Remote Password (SRP) プロトコルは Internet Standards Working Group Request For Comments 2945 (RFC2945) で記述された公開鍵交換のハンドシェイクの実装です。
第13章 セキュアリモートパスワードプロトコル JBoss Enterprise Application Platform 5 | Red Hat Customer Portal
- ユーザープールのアプリケーションクライアントの設定 - Amazon Cognito の 「許可されている OAuth スコープ」のところ
- CognitoユーザープールのOAuthスコープ 5パターン | Awstut
スコープが5つ(+カスタムスコープ)しかない(とその組み合わせ)。
- Googleの場合 - OAuth 2.0 Scopes for Google APIs | Authorization | Google Developers たくさんあるなあ。このURLっぽいのがスコープ。
- GitHub - Scopes for OAuth Apps - GitHub Docs これもたくさんある。
- それ以外では https://oauth.net/2/scope/ からリンクが。
認可サーバ(Cognitoのuser pool)側で許可するスコープをスペースで区切って設定。 リソースオーナーの認可リクエストでほしいスコープをスペースで区切って要求。 (あたりまえなんだけど、それにもかかわらず間違えたのでメモ)
で、スコープが5つしかないので 「S3読みたい」とかはOAuthでもらったアクセストークンからは出来ない。
IDトークンと STSの AssumeRoleWithWebIdentityCommand | STS Client - AWS SDK for JavaScript v3 からsession token(とその他)を得て、これをつかってAPIにアクセスする。
ChatGPTにざっくり書いてもらったAWS SDK for Javascript v3での例。 id tokenから、session token(とその他)を得て、S3バケットからで
(実際に動かしてません。かなり間違ってる)
const { S3Client } = require('@aws-sdk/client-s3');
const { StsClient } = require('@aws-sdk/client-sts');
// Initialize the STS client
const sts = new StsClient({
region: '<region>',
credentials: {
accessKeyId: '<accessKeyId>',
secretAccessKey: '<secretAccessKey>'
}
});
// Assume a role with the web identity token
const assumeRoleWithWebIdentity = async () => {
const params = {
RoleArn: '<roleArn>',
RoleSessionName: '<roleSessionName>',
WebIdentityToken: '<webIdentityToken>',
DurationSeconds: 3600
};
try {
const data = await sts.assumeRoleWithWebIdentity(params).promise();
const accessKeyId = data.Credentials.AccessKeyId;
const secretAccessKey = data.Credentials.SecretAccessKey;
const sessionToken = data.Credentials.SessionToken;
// Initialize the S3 client with the assumed role credentials
const s3 = new S3Client({
region: '<region>',
credentials: {
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
sessionToken: sessionToken
}
});
// Read an object from S3
const result = await s3
.getObject({
Bucket: '<bucketName>',
Key: '<objectKey>'
})
.promise();
console.log(result);
} catch (error) {
console.error(error);
}
};
assumeRoleWithWebIdentity();
AWS CLIだと
aws sts assume-role-with-web-identity \
--role-arn <ARN of the IAM Role> \
--role-session-name <Session name> \
--web-identity-token <ID Token obtained from Cognito> \
--duration-seconds <Session duration in seconds>
assume-role-with-web-identity — AWS CLI 2.9.23 Command Reference のところの機械翻訳
モバイルアプリケーションあるいはウェブアプリケーションで、 ウェブ ID プロバイダによる認証を受けたユーザの一時的なセキュリティ証明書のセットを返します。プロバイダの例としては、OAuth 2.0 プロバイダの Login with Amazon や Facebook、 あるいは Google や Amazon Cognito federated identities などの OpenID Connect 互換の ID プロバイダがあります。
この API が返す一時的なセキュリティ認証情報は、アクセスキー ID、シークレットアクセスキー、およびセキュリティトークンで構成されます。アプリケーションは、これらの一時的なセキュリティ証明書を使用して、Amazon Web Services サービス API 操作の呼び出しに署名することができます。