使用 Amazon Cognito 身分授權 - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon Cognito 身分授權

有兩種類型的 Amazon Cognito 身分:未驗證和已驗證。如果您的應用程式支援未驗證 Amazon Cognito 身分,則不會執行身分驗證,因此您不知道使用者是誰。

Unauthenticated Identities:(未驗證的身分) 對於未驗證的 Amazon Cognito 身分,您可以將 IAM 角色連接至未驗證的身分集區來授予許可。建議只授予您想要提供給未知使用者使用之資源的存取權。

重要

對於連線到的未經驗證的 Amazon Cognito 使用者 AWS IoT Core,建議您授予 IAM 政策中非常有限資源的存取權。

Authenticated Identities (已驗證的身分):對於已驗證的 Amazon Cognito 身分,您需要在兩個位置指定許可:

  • 將 IAM 政策連接到已驗證的 Amazon Cognito 身分集區,

  • 將 AWS IoT Core 政策附加到 Amazon Cognito 身分識別 (已驗證的使用者)。

未經驗證和已驗證的 Amazon Cognito 使用者連線 AWS IoT Core的政策範例

下列範例顯示在 IAM 政策與 Amazon Cognito 身分 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 是一組工具和服務,可協助您建置與服 AWS 務整合的 Web 和行動應用程式。如需有關 Amplify 的詳細資訊,請參閱 Amplify Framework 說明文件

這兩個範例都會執行以下步驟。

  1. 當使用者註冊帳戶時,應用程式會建立 Amazon Cognito 使用者集區和身分。

  2. 當使用者進行身分驗證時,應用程式會建立政策並將其連接至身分。這會為使用者提供發佈和訂閱許可。

  3. 使用者可以使用應用程式來發佈和訂閱 MQTT 主題。

第一個範例在身分驗證操作中直接使用 AttachPolicy API 操作。下面的範例示範如何在使用 Amplify 和 適用於 JavaScript 的 AWS IoT Device SDK的 React 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 身分識別集區取得的 AWS 登入資料呼叫函數時,Lambda 函數中的內容物件會包含的context.cognito_identity_id值。如需更多資訊,請參閱下列內容。