使用 Amazon Cognito 身份的授权 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon Cognito 身份的授权

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

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

重要

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

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

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

  • 将 Amazon IoT Core 策略附加到 Amazon Cognito 身份(经过身份验证的用户)。

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

以下示例显示了 Amazon Cognito 身份的 IAM 策略和 IoT 策略中的权限。经过身份验证的用户希望发布到设备特定的主题(例如 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 是一组工具和服务,可帮助您构建与 Amazon 服务集成的网络和移动应用程序。有关 Amplify 的更多信息,请参阅 Amplify Framework Documentation

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

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

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

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

第一个示例直接在身份验证操作中使用 AttachPolicy API 操作。以下示例演示如何在使用 Amplify 和 Amazon IoT Device SDK for JavaScript 的反应 Web 应用程序中实现此 API。

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 函数中实现 AttachPolicy API 操作。以下示例说明 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 函数中。

注意

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