本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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 說明文件
這兩個範例都會執行以下步驟。
-
當使用者註冊帳戶時,應用程式會建立 Amazon Cognito 使用者集區和身分。
-
當使用者進行身分驗證時,應用程式會建立政策並將其連接至身分。這會為使用者提供發佈和訂閱許可。
-
使用者可以使用 應用程式來發佈和訂閱MQTT主題。
第一個範例會直接在身分驗證AttachPolicy
API操作內使用 操作。下列範例示範如何在使用 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 函數中實作 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.jsiot.GetPolicy
函數中。
注意
當您使用透過 Amazon Cognito Identity 集區取得的 AWS 憑證呼叫函數時,Lambda 函數中的內容物件會包含 的值context.cognito_identity_id
。如需更多資訊,請參閱下列內容。