web-dev-qa-db-ja.com

LambdaトリガーのAWS Cognitoユーザー属性を変更することは可能ですか

AWSドキュメントを見て、

https://docs.aws.Amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html#cognito-user-pools-lambda- trigger-syntax-pre-signup

次のパラメーターをPre Sign-upLambda fuctionで使用できます:

"request": {
  "userAttributes": {
    "string": "string",
    ....
},
"validationData": {<validation data as key-value (String, String) pairs, from the client>}

イベントオブジェクトを変更または追加する方法はありますかuserAttributes

例えば:

// Modify an existing username...
event.request.userAttributes.name.ucfirst();

// Add an additional attribute...
event.request.userAttributes.nickname = "ANY_NAME";


callback(null, event);
17
altus

はい、絶対に方法があります! LambdaハンドラーでAWS javascript SDKを使用する必要があります。

const AWS = require('aws-sdk');
AWS.config.update({region: 'ap-southeast-1'});

const cognitoidentityserviceprovider =
  new AWS.CognitoIdentityServiceProvider({
    apiVersion: '2016-04-18'
  });
cognitoidentityserviceprovider.adminUpdateUserAttributes(
  {
    UserAttributes: [
      {
        Name: 'YOUR_USER_ATTRIBUTE_NAME',
        Value: 'YOUR_USER_ATTRIBUTE_VALUE'
      }
    ],
    UserPoolId: event.userPoolId,
    Username: event.userName
  },
  function(err, data) {
    ...
  }
);

Lambda関数に正しいポリシー(つまり、「cognito-idp:AdminUpdateUserAttributes」アクションを許可する)を指定し、ユーザープールに属性が定義されていることを確認してください。

8
Khoi

サインアップ中に属性を変更/拡張する方法はありませんが、サインイン中に pre-token generation trigger を使用して属性を変更/拡張できます。

4
behrooziAWS

この質問についての洞察を探している他の人のために、以下に例を示します

以下のラムダ関数#1は、2つのカスタム属性idaおよびethaddressを取ります。 CognitoユーザープールのPreSignUpHook中にラムダが呼び出されます

#2(イベント変更ログの前)これらの属性の元の値はida=1およびethaddress=ABCD

#3(イベント変更後ログ)は、これらの属性の変更された値を反映します:ida=2およびethaddress=EFGH

ただし、cognitoに保存される値は元の値です:ida=1およびethaddress=ABCD。そのため、presignuphook中にuserAttributesを更新しても、一部の回答で示唆されているように機能しません。

補足として、応答オブジェクトの事前定義された属性が変更されると、期待どおりに更新されます。

"response": {
    "autoConfirmUser": true,
    "autoVerifyEmail": false,
    "autoVerifyPhone": false
}
'use strict';
global.fetch = require('node-fetch')

module.exports.preSignUp = async (event, context, callback) => {
// Set the user pool autoConfirmUser flag after validating the email domain

let data = await fetch("http://***.***.***/api/members/create",
{
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    method: "POST",
})
.then(res => res.json())
.then(res => res);

event.response.autoConfirmUser = true;
console.log('before event:', JSON.stringify(event)); 
event.request.userAttributes['custom:ethaddress'] = String(data.address); 
event.request.userAttributes['custom:ida'] = "2";  
console.log('Received event:', JSON.stringify(event));  
console.log('Address:', data.address);


 // Return to Amazon Cognito
callback(null, event);
 };

イベント変更ログの前:

2019-01-20T01:02:24.639Z    edce636e-75ea-492b-b6a0-dd4f22dc9038    before event:
{
    "version": "1",
    "region": "us-east-1",
    "userPoolId": "us-east-1-*****",
    "userName": "*******@gmail.com",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "******************"
    },
    "triggerSource": "PreSignUp_SignUp",
    "request": {
        "userAttributes": {
            "custom:ida": "1",
            "custom:ethaddress": "ABCD",
            "email": "*******@gmail.com"
        },
        "validationData": {}
    },
    "response": {
        "autoConfirmUser": true,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    }
}

イベント変更ログ後:

Received event:
{
    "version": "1",
    "region": "us-east-1",
    "userPoolId": "us-east-1_0BaE6eaTY",
    "userName": "*******@gmail.com",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "*****************"
    },
    "triggerSource": "PreSignUp_SignUp",
    "request": {
        "userAttributes": {
            "custom:ida": "2",
            "custom:ethaddress": "EFGH",
            "email": "*******@gmail.com"
        },
        "validationData": {}
    },
    "response": {
        "autoConfirmUser": true,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    }
}

更新:

PRESIGNUPプロセスの一部としてこれを行う方法はないようですが、以下に示す認識例のPOSTCONFIRMATIONトリガーとしてこれを行うことは可能です。

気をつけるべきことがいくつかあります。

  1. カスタム属性がCognitoに追加されており、変更可能です。
  2. アプリクライアントで->詳細を表示-> "属性の読み取りおよび書き込み権限を設定"カスタム属性に読み取りおよび書き込み権限が下にあることを確認します。
  3. ラムダ関数に、実行を許可するROLEがあることを確認します:adminUpdateUserAttributes例: AmazonCognitoPowerUserポリシーをLambaRoleに添付します。

module.exports.postConfirmation = async(event、context、callback)=> {

const cognitoIdServiceProvider = new CognitoIdentityServiceProvider({
region: 'us-east-1'
});

var params =  {
    UserAttributes: [
    {
        Name: 'custom:sillyName',
        Value: 'customSillyName'
    }
    ],
    UserPoolId: event.userPoolId,
    Username: event.userName
}

cognitoIdServiceProvider.adminUpdateUserAttributes(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else     console.log(data);           // successful response
}); 

callback(null,event);

};

ユーザーcognitoIdServiceProvider.adminUpdateUserAttributes preSignUpトリガーでフックします;ユーザーがまだ終了しないという例外を受け取ります

1
Shivam Sinha