Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon Cognito ユーザープールの作成後に属性を変更するにはどうすればよいですか?
Amazon Cognito ユーザープールを作成しましたが、今はユーザー登録に必要な標準属性を変更したいと考えています。
簡単な説明
ユーザープールを作成してから標準ユーザープールの属性を変更することはできません。代わりに、ユーザー登録で要求する属性がある新しいユーザープールを作成します。続いて、AWS Lambda 関数をユーザー移行トリガーとして使用し、既存のユーザーを新しいユーザープールに移行します。
注: カスタム属性を既存のユーザープールに追加することはできますが、こうした属性はユーザー登録では要求されません。
解決方法
新しいユーザープールを別の属性で設定する
新しいユーザープールを作成します。続いて、目的に合わせて標準属性を編集してから、[プールの作成] を選択します。
重要: ユーザープールで新しい必須属性を指定する場合は、Lambda 関数の設計で、この新しい属性を新しいユーザープールに提供するようにしてください。新しい属性を提供する関数を設計しないと、ユーザー移行時に認証が失敗します。たとえば、古いユーザープールで要求されるのは電子メールのみだが、新しいユーザープールでは電子メールと電話番号の両方が要求されるとします。この場合、電話番号の属性値を新しいユーザープールに渡すと、ユーザーが正常に認証されます。
Lambda 関数を作成する
ユーザー移行 Lambda 関数を作成するには、Lambda コンソールエディタを使用するか、独自のデプロイパッケージを作成してアップロードします。
重要: このサンプルコードは、古いユーザープールで多要素認証 (MFA) を使用するユーザーを移行する場合には機能しません。
設定をテストするには、Python で次のサンプル関数を使用してください。
# Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. # Permission is hereby granted, free of charge, to any person obtaining a copy of this # software and associated documentation files (the "Software"), to deal in the Software # without restriction, including without limitation the rights to use, copy, modify, # merge, publish, distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import json import boto3 client = boto3.client('cognito-idp') def lambda_handler(event, context): if (event['triggerSource'] == 'UserMigration_Authentication'): user = client.admin_initiate_auth( UserPoolId='<user pool id of the user pool where the user already exists>', ClientId='<app client id of the user pool where the user already exists>', AuthFlow='ADMIN_NO_SRP_AUTH', AuthParameters={ 'USERNAME': event['userName'], 'PASSWORD': event['request']['password'] } ) if (user): userAttributes = client.get_user( AccessToken=user['AuthenticationResult']['AccessToken'] ) for userAttribute in userAttributes['UserAttributes']: if userAttribute['Name'] == 'email': userEmail = userAttribute['Value'] #print(userEmail) event['response']['userAttributes'] = { "email": userEmail, "email_verified": "true" } event['response']['messageAction'] = "SUPPRESS" print (event) return (event) else: return('Bad Password') elif (event["triggerSource"] == "UserMigration_ForgotPassword"): user = client.admin_get_user( UserPoolId='<user pool id of the user pool where the already user exists>', Username=event['userName'] ) if (user): for userAttribute in user['UserAttributes']: if userAttribute['Name'] == 'email': userEmail = userAttribute['Value'] print(userEmail) event['response']['userAttributes'] = { "email": userEmail, "email_verified": "true" } event['response']['messageAction'] = "SUPPRESS" print (event) return (event) else: return('Bad Password') else: return('there was an error')
注: UserPoolId は、古いユーザープールの ID に置き換えてください。ID は Amazon Cognito コンソールで探してください。ユーザープールの管理ページの [一般設定] にあります。ClientId は、古いユーザープールのアプリクライアント ID に置き換えてください。アプリクライアント ID は、Amazon Cognito コンソールの [アプリクライアント] で探してください。
ユーザー移行トリガーを新しいユーザープールに追加する
Amazon Cognito コンソールで、新しい Lambda 関数をユーザー移行 Lambda トリガーに設定します。詳細については、「ユーザープール Lambda トリガーの追加」を参照してください。
ユーザー移行で USER_PASSWORD_AUTH フローをオンにする
移行時に USER_PASSWORD_AUTH 認証フローを使用するようユーザープールアプリクライアントを設定します。この認証フローにより、アプリではユーザーのユーザー名とパスワードを Lambda 関数に渡すことができます。そうすることで、認証フローでは既存のユーザープールのユーザーを認証できます。
デフォルトの認証フローを USER_PASSWORD_AUTH フローに変更するロジックをアプリに追加します。ユーザーが古いユーザープールには存在しても新しいユーザープールには存在しない場合のログイン試行の認証フローは、ロジックで変更するようにします。
たとえば、アプリで JavaScript を使用している場合は、cognitoUser.setAuthenticationFlowType を USER_PASSWORD_AUTH に指定します。
**注:**ユーザーを移行してからは、アプリの認証フローを USER_SRP_AUTH に変更するのがベストプラクティスです。このフローでは Secure Remote Password (SRP) プロトコルを使用するので、ユーザーはパスワードを送信しなくてもネットワーク経由で認証されます。また、このフローには USER_PASSWORD_AUTH フローよりもセキュリティ上の利点があります。
cognitoUser.setAuthenticationFlowType('USER_PASSWORD_AUTH'); cognitoUser.authenticateUser(authenticationDetails, { onSuccess: function(result) { // User authentication was successful }, onFailure: function(err) { // User authentication was not successful }, mfaRequired: function (codeDeliveryDetails) { // MFA is required to complete user authentication. // Get the code from user and call cognitoUser.sendMFACode(verificationCode, this); } });
セットアップをテストする
Amazon Cognito でホストするウェブ UI を使用してアプリにログインし、認証フローをテストします。ログインしたユーザーは、新しいユーザープールで認証されてから移行されます。
注: 設定をテストするためにログインするユーザーアカウントがない場合は、新しいユーザーを作成してください。
問題をトラブルシューティングする
テスト中に「ユーザー移行中の例外」などのエラーメッセージが表示されたら、Lambda からのステートメントのログ記録をオンにします。この設定では、ユーザー移行 Lambda トリガーのパラメータのログを Amazon CloudWatch logs に記録します。エラーを再現し、ユーザー移行 Lambda トリガーのパラメータまたは構文エラーに関する問題がないかをログで確認します。
関連情報
Lambda トリガーによるユーザープールのワークフローのカスタマイズ

関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 2年前lg...
- 質問済み 5ヶ月前lg...
- 質問済み 2ヶ月前lg...