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

使用 Amazon Cognito 身份的授权

存在两种类型的 Amazon Cognito 身份:经过身份验证的身份和未经身份验证的身份。当您的应用程序支持未经身份验证的 Amazon Cognito 身份时,不会执行身份验证,因此您不知道用户的身份。对于这些用户,您可以通过将 IAM 角色附加到未经身份验证的身份池来授予权限。我们建议您应仅授予对希望可供未知用户使用的那些资源的访问权限。

当您的应用程序支持经过身份验证的 Amazon Cognito 身份时,为了验证用户身份,您需要在两个位置指定策略。您需要将 IAM policy 附加到经过身份验证的 Amazon Cognito Identity 池,并将 Amazon IoT Core 策略附加到 Amazon Cognito Identity 上。

经过身份验证和未经身份验证的用户是不同的身份类型。如果您没有将 Amazon IoT 策略附加到 Amazon Cognito Identity,则经过身份验证的用户无法在 Amazon IoT 中获得授权并无权访问 Amazon IoT 资源和操作。有关为 Amazon Cognito 身份创建策略的更多信息,请参阅 发布/订阅策略示例

以下 GitHub 上的 Web 应用程序示例说明了如何将针对已验证用户的策略附件合并到用户注册和身份验证过程中。

Amplify 是一组工具和服务,可以帮助您用 Amazon 服务构建 web 和移动应用。有关 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 Identity 池获得的 context.cognito_identity_id 凭证调用函数时,Lambda 函数中的上下文对象包含 Amazon 的值。有关更多信息,请参阅下列内容。