使用 Amazon Cognito 身份的授权 - AWS IoT Core

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon Cognito 身份的授权

存在两种类型的 Amazon Cognito 身份:经过身份验证的身份和未经身份验证的身份。当您的应用程序支持未经身份验证的 Amazon Cognito 身份时,将不会执行身份验证,因此您不知道用户的身份。

未经身份验证的身份:对于未经身份验证的 Amazon Cognito 身份,您可以通过将角色附加到未经身份验证IAM的身份池来授予权限。我们建议您仅授予对希望可供未知用户使用的那些资源的访问权限。

重要

适用于连接至的未经身份验证的 Amazon Cognito 用户 AWS IoT Core,我们建议您在IAM策略中允许访问非常有限的资源。

经过身份验证的身份:对于经过身份验证的 Amazon Cognito 身份,您需要在两个位置指定权限:

  • 将IAM策略附加到经过身份验证的 Amazon Cognito 身份池和

  • 附上一个 AWS IoT Core Amazon Cognito 身份(经过身份验证的用户)的政策。

未经身份验证和身份验证的 Amazon Cognito 用户连接到的策略示例 AWS IoT Core

以下示例显示了 Amazon Cognito 身份的IAM策略和物联网策略中的权限。经过身份验证的用户想要发布到设备特定的主题(例如 device/ DEVICE _id/Status)。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/Client_ID" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/device/Device_ID/status" ] } ] }

以下示例显示了 Amazon Cognito 未经身份验证的角色的IAM策略中的权限。未经身份验证的用户希望发布到不需要身份验证的非设备特定主题。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:client/*" ] }, { "Effect": "Allow", "Action": [ "iot:Publish" ], "Resource": [ "arn:aws:iot:us-east-1:123456789012:topic/non_device_specific_topic" ] } ] }

GitHub 例子

以下示例 Web 应用程序 GitHub 展示了如何将对经过身份验证的用户的策略附件纳入用户注册和身份验证流程。

Amplify 是一组工具和服务,可帮助您构建与之集成的网络和移动应用程序 AWS 服务的支持。有关 Amplify 的更多信息,请参阅 Amplify Framework Documentation

这两个示例都执行了以下步骤。

  1. 用户注册账户时,应用程序会创建 Amazon Cognito 用户池和身份。

  2. 用户进行身份验证时,应用程序将创建策略并将其附加到身份。这授予用户发布和订阅的权限。

  3. 用户可以使用该应用程序发布和订阅MQTT主题。

第一个示例直接在身份验证AttachPolicyAPI操作中使用该操作。以下示例演示了如何在使用 Amplify 的 React Web 应用程序中实现此API调用 AWS IoT Device SDK for JavaScript.

function attachPolicy(id, policyName) { var Iot = new AWS.Iot({region: AWSConfiguration.region, apiVersion: AWSConfiguration.apiVersion, endpoint: AWSConfiguration.endpoint}); var params = {policyName: policyName, target: id}; console.log("Attach IoT Policy: " + policyName + " with cognito identity id: " + id); Iot.attachPolicy(params, function(err, data) { if (err) { if (err.code !== 'ResourceAlreadyExistsException') { console.log(err); } } else { console.log("Successfully attached policy with the identity", data); } }); }

此代码出现在 AuthDisplay.js 文件中。

第二个示例在 Lambda 函数中实现该AttachPolicyAPI操作。以下示例显示了 Lambda 如何使用此API调用。

iot.attachPolicy(params, function(err, data) { if (err) { if (err.code !== 'ResourceAlreadyExistsException') { console.log(err); res.json({error: err, url: req.url, body: req.body}); } } else { console.log(data); res.json({success: 'Create and attach policy call succeed!', url: req.url, body: req.body}); } });

此代码出现在app.js文件的 iot.GetPolicy 函数中。

注意

当你用调用函数时 AWS 您通过 Amazon Cognito 身份池获得的证书,您的 Lambda 函数中的上下文对象包含的值。context.cognito_identity_id有关更多信息,请参阅下列内容。