如何将物联网核心策略附加到Amplify部署的web应用程序的身份验证后Lambda触发器上的Cognito Ident



情况:

  1. 我有一个ReactJS web应用程序,它通过AWS Amplify部署,并使用Amplify Studio后端通过Cognito服务和AWS-Amplify-sdk(登录、注册)处理身份验证。

  2. 该web应用程序还实现了使用react native aws amplified sdk pubsub来订阅IoT Core中的MQTT主题并检索消息,但仅限于经过身份验证的用户

  3. 根据pubsub文档中的步骤2:将您的策略附加到您的Amazon Cognito身份。

如果我使用AWS CLI将物联网策略附加到用户,然后通过web应用程序与该用户登录,我就能够成功订阅并接收MQTT消息——它工作正常!

问题:

该应用程序允许Cognito自助服务用户注册(自助注册),预计会有许多用户。

  1. 我在Amplify服务创建的Cognito用户池中实现了身份验证后lambda触发器功能。

  2. lambda函数运行AWS文档中的以下示例,其中包含两(2)个附加控制台日志:

exports.handler = (event, context, callback) => {
// Send post authentication data to Cloudwatch logs
console.log ("Authentication successful");
console.log ("Trigger function =", event.triggerSource);
console.log ("User pool = ", event.userPoolId);
console.log ("App client ID = ", event.callerContext.clientId);
console.log ("User ID = ", event.userName);
*** console.log("Event = ", event);
console.log("Context = ", context);***
// Return to Amazon Cognito
callback(null, event);
};
  1. 然后我通过应用程序再次与用户进行身份验证,并转到Lambda函数的CloudWatch日志。

  2. 这是我在身份验证后触发后从日志记录事件和上下文中获得的信息:

事件日志:

{
version: '1',
region: 'us-east-1',
userPoolId: 'us-east-1_*********',
userName: '4eea4a48-92b6-45da-b26e-*********',
callerContext: {
awsSdkVersion: 'aws-sdk-unknown-unknown',
clientId: '*********'
},
triggerSource: 'PostAuthentication_Authentication',
request: {
userAttributes: {
sub: '4eea4a48-92b6-45da-b26e-*********',
'cognito:email_alias': '*********.com',
'cognito:user_status': 'CONFIRMED',
email_verified: 'true',
name: 'asdfasdf',
email: '*********.com'
},
newDeviceUsed: false
},
response: {}
}

上下文日志:

{
callbackWaitsForEmptyEventLoop: [Getter/Setter],
succeed: [Function (anonymous)],
fail: [Function (anonymous)],
done: [Function (anonymous)],
functionVersion: '$LATEST',
functionName: 'userAccess_iotCore_attachPolicyToCognitoIdentityID',
memoryLimitInMB: '128',
logGroupName: '/aws/lambda/userAccess_iotCore_attachPolicyToCognitoIdentityID',
logStreamName: '2023/01/13/[$LATEST]4eb4287aa4db4dd8a6b6efd810a7***',
clientContext: undefined,
identity: undefined,
invokedFunctionArn: 'arn:aws:lambda:us-east-1:*********:function:userAccess_iotCore_attachPolicyToCognitoIdentityID',
awsRequestId: 'bf6afd1c-117c-4a9e-9d3b-*********',
getRemainingTimeInMillis: [Function: getRemainingTimeInMillis]
}
  1. 这里的大问题是context.identity未定义,因此我无法获得该已验证用户的Amazon Cognito identity Id,以附加PubSub通过应用程序工作所需的物联网策略

问题:

  1. 如何在后身份验证触发后获得Amazon Cognito Identity Id,然后附加物联网策略?

  2. 通过使用aws-amplify-sdk的web应用程序,我可以在登录后获得此Id。是否有任何API可以从应用程序中用于附加此策略?

谢谢。

我在最近的一篇文章中回答了将物联网策略附加到Cognito Identity ID的问题。但要准确回答您的问题:

  1. 您无法在lambda函数输入参数中检索此信息。该调用是由AWS发起的,而不是Cognito客户端。然而,您的lambda可以调用以列出可用的Cognito身份ID,并确保每个ID都附加了IoT策略。。。

  2. 是的。您在web-console(或CLI)中所做的一切都通过API。但我不会这么做:为此,您需要将iot:attachPolicy权限授予Cognito假定的Authenticated Role,并且无法将iot:attachPolicy操作限制为启动器的身份ID。这意味着,任何经过身份验证的用户都可以将物联网策略附加到他想要的任何东西上。正如这里所提到的,这是过分宽容的。

我对此的看法:在确保安全性和最低特权原则的同时,最好的方法是定义一个在身份验证后触发的lambda函数。lambda函数将策略附加到Cognito Identity ID,如果调用是由Cognito用户进行的,则可以通过上下文参数访问该ID。

相关内容