我想将物联网策略附加到给予我的应用程序的联邦用户的Cognito身份。我试图在我的用户池的Post确认触发器中使用Lambda函数来做到这一点。下面是我的函数:
const AWS = require('aws-sdk');
const iot = new AWS.Iot();
exports.handler = async function(event, context) {
const policyName = 'arn:aws:iam::XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const target = context.identity.cognitoIdentityId;
await iot.attachPolicy({ target, policyName }).promise();
const response = {
statusCode: 200,
body: JSON.stringify('Policy attached.'),
};
return response;
};
当这个函数运行时我得到一个错误:
"cannot read property 'cognitoidentityid' of undefined"
如果将principal定义为
,则出现类似错误const principal = context.cognito_identity_id; //error: "Missing required key 'target' in params"
根据Iot文档," Lambda函数中的context对象包含context的值。cognito_identity_id,当您使用通过Amazon cognito_identity池获得的AWS凭证调用该函数时。"有人能告诉我怎么做吗?
我应该补充说,我想为桌面和移动用户附加此策略。Lambda文档暗示上下文对象的identity属性仅为移动应用程序提供。如果这是真的,那么是否有一种不同的方式将物联网策略附加到所有Cognito标识,移动和桌面一样?
感谢总而言之,您将无法在Cognito的post确认触发器中获得身份id。
为了克服它,客户端可以调用单独的Lambda函数(一旦用户被确认),并且在Lambda中可以附加策略,因为在这里您将获得身份id。
我不喜欢的另一种选择是客户端自己在用户确认后附加一个策略。
附加策略API - https://docs.aws.amazon.com/iot/latest/apireference/API_AttachPolicy.html