AWSドキュメントを見て、
次のパラメーターを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);
はい、絶対に方法があります! 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」アクションを許可する)を指定し、ユーザープールに属性が定義されていることを確認してください。
サインアップ中に属性を変更/拡張する方法はありませんが、サインイン中に pre-token generation trigger を使用して属性を変更/拡張できます。
この質問についての洞察を探している他の人のために、以下に例を示します
以下のラムダ関数#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トリガーとしてこれを行うことは可能です。
気をつけるべきことがいくつかあります。
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トリガーでフックします;ユーザーがまだ終了しないという例外を受け取ります