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

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

使用 Amazon Cognito 身分授權

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

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

重要

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

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

  • 將IAM政策連接至已驗證的 Amazon Cognito Identity 集區,以及

  • 將 AWS IoT Core 政策連接至 Amazon Cognito Identity (已驗證的使用者)。

未經驗證和已驗證的 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 是一組工具和服務,可協助您建置與服務整合的 Web 和行動應用程式 AWS 。如需有關 Amplify 的詳細資訊,請參閱 Amplify Framework 說明文件

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

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

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

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

第一個範例會直接在身分驗證AttachPolicyAPI操作內使用 操作。下列範例示範如何在使用 Amplify 和 的 React Web 應用程式中實作此API呼叫 適用於 JavaScript 的 AWS IoT Device SDK。

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 函數中。

注意

當您使用透過 Amazon Cognito Identity 集區取得的 AWS 憑證呼叫函數時,Lambda 函數中的內容物件會包含 的值context.cognito_identity_id。如需更多資訊,請參閱下列內容。