2017-02-20 20 views
0

У меня есть функция AWS Lambda, которая прикрепляется как триггер к пулу пользователей в событии «Сообщение подтверждения».Как получить идентификатор пользователя cognito IdentityId

Мне нужно получить IdentityId пользователя, который был создан, как я могу это сделать?

Вот мой код:

'use strict'; 
var AWS = require('aws-sdk'); 
var region = 'eu-west-1' 
var sqs = new AWS.SQS({region : region}); 
var s3 = new AWS.S3({region : region}); 
var util = require('util'); 
let awsAccountId = 'xx'; 
let queueName = 'xx'; 

// this function saves public user data to a bucket where clients can access it. 

let putObjectToS3 = (bucket, key, data, contentType, callback) => { 
     let params = { 
      Bucket : bucket, 
      Key : key, 
      Body : data, 
      CacheControl: "max-age=864000", 
      ContentType: contentType 
     } 
     s3.putObject(params, callback); 
} 

let sendSQSMessage = (dataStr, callback) => { 
    let queueURL = 'https://sqs.' + region + '.amazonaws.com/' + awsAccountId + '/' + queueName; 
    let params = { 
    MessageBody: dataStr, 
    QueueUrl: queueURL 
    }; 
    sqs.sendMessage(params, callback); 
} 

exports.handler = (event, context, callback) => { 
    console.log('event', event) 

    let S3key = 'publicuserdata/' + event.request.userAttributes.sub + '.json'; 
    let publicUserData = {}; 
    publicUserData['IdentityId'] = context.identity.cognitoIdentityId; //doesn't seem to work 
    publicUserData['region'] = event.region; 
    publicUserData['userName'] = event.userName; 
    publicUserData['userPoolId'] = event.userPoolId; 

    let finishLambdaCallback = (err, result) => { 
     if (err) { 
      console.log('error', err) 
     } else { 
      console.log('success', result) 
      context.done(null, event) 
     } 
    }; 

    let funcOne = (callback) => { 
     let data = util.inspect(context) 
     //let data = JSON.stringify(context, null, 2) 

     putObjectToS3( 'files.example.org', 
         S3key, 
         data, 
         'application/json', 
         callback); 
    } 

    let funcTwo = (callback) => { 
     let data = util.inspect(context) 
     //let data = JSON.stringify(context, null, 2) 
     sendSQSMessage(data, callback); 
    } 

    funcOne(() => {funcTwo(finishLambdaCallback)}) 

}; 

ответ

0

Похоже, там может быть путаница в том, как тождественные бассейны и бассейны пользователей взаимодействуют.

Контекст.identity.cognitoIdentityId заполняется идентификатором идентификатора только тогда, когда Lambda вызывается с учетными данными, созданными федеративными идентификаторами Cognito. Когда это просто вызов лямбды из пулов пользователей Cognito, это не так.

Пулы пользователей Cognito и федеративные идентификаторы Cognito являются двумя отдельными службами, рассматривают пулы пользователей как еще один поставщик удостоверений для федеративных идентификаторов. Это означает, что идентификатор идентификатора не будет создан автоматически, когда пользователь в вашем пуле пользователей, вы должны фактически использовать токены, созданные для этого пользователя, чтобы создать личность в вашем пуле идентификации. Итак, если вы хотите создать идентификатор в пуле идентификаторов для этого пользователя, вызовите GetId с помощью токена id. См. this docs page.