允許未經驗證的訪客使用 Amazon Cognito 存取您的應用程式 - Amazon Location Service

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

允許未經驗證的訪客使用 Amazon Cognito 存取您的應用程式

您可以使用 Amazon Cognito 身份驗證作為直接將 AWS Identity and Access Management (IAM) 與前端開發套件和直接 HTTPS 請求搭配使用的替代方法。

您可能基於以下原因想要使用這種身份驗證形式:

  • 未經驗證的使用者 — 如果您擁有匿名使用者的網站,您可以使用 Amazon Cognito 身分集區。如需詳細資訊,請參閱(詳見)一節允許未經驗證的訪客使用 Amazon Cognito 存取您的應用程式。

  • 您自己的身份驗證 — 如果您想要使用自己的身份驗證程序,或結合多種身份驗證方法,可以使用 Amazon Cognito 聯合身分。如需詳細資訊,請參閱 Amazon Cognito 開發人員指南中的聯合身分門。

Amazon Cognito 為網頁和行動應用程式提供身份驗證、授權和使用者管理功能。您可以將 Amazon Cognito 未經驗證的身分集區與 Amazon 位置搭配使用,作為應用程式擷取臨時、速 AWS 度較低的登入資料的一種方式。

如需詳細資訊,請參閱 Amazon Cognito 開發人員指南中的使用者集區門。

注意

對於行動開發人員,Amazon 位置提供適用於 iOS 和 Android 的行動驗證 SDK,請參閱下列 github 儲存庫以取得詳細資訊:

建立 Amazon Cognito 身分集區

您可以建立 Amazon Cognito 身分集區,以允許未經驗證的訪客透過 Amazon Cognito 主控台、或 Amazon Cognito API 存取 AWS CLI您的應用程式。

重要

您建立的集 AWS 區必須 AWS 帳戶 與您正在使用的 Amazon 定位服務資源位於相同的區域。

您可以透過下列動作使用與未驗證身分角色相關聯的 IAM 政策:

  • geo:GetMap*

  • geo:SearchPlaceIndex*

  • geo:GetPlace

  • geo:CalculateRoute*

  • geo:GetGeofence

  • geo:ListGeofences

  • geo:PutGeofence

  • geo:BatchDeleteGeofence

  • geo:BatchPutGeofence

  • geo:BatchEvaluateGeofences

  • geo:GetDevicePosition*

  • geo:ListDevicePositions

  • geo:BatchDeleteDevicePositionHistory

  • geo:BatchGetDevicePosition

  • geo:BatchUpdateDevicePosition

包括其他 Amazon 位置動作將不會產生任何作用,且未經驗證的身分將無法呼叫它們。

使用 Amazon Cognito 主控台建立身分集區

  1. 前往 Amazon Cognito 主控台

  2. 選擇 Manage Identity Pools (管理身分集區)

  3. 選擇 [建立新身分集區],然後輸入身分集區的名稱。

  4. 從 [未驗證的身分可收合] 區段中,選擇 [啟用存取未驗證身分]。

  5. 選擇 Create Pool (建立集區)。

  6. 選擇要搭配身分集區使用的 IAM 角色。

  7. 展開檢視詳細資料

  8. 在「未驗證的身分」下,輸入角色名稱。

  9. 展開「檢視原則文件」區段,然後選擇 「編輯」以新增原則。

  10. 新增您的政策以授與資源的存取權。

    以下是「地圖」、「地點」、「追蹤器」和「路線」的政策範例。若要將範例用於您自己的政策,請取代區域accountID 預留位置符號:

    Maps policy example

    下列策略授與名為的對映資源的唯讀存取權ExampleMap

    { "Version": "2012-10-17", "Statement": [ { "Sid": "MapsReadOnly", "Effect": "Allow", "Action": [ "geo:GetMapStyleDescriptor", "geo:GetMapGlyphs", "geo:GetMapSprites", "geo:GetMapTile" ], "Resource": "arn:aws:geo:region:accountID:map/ExampleMap" } ] }

    新增符合的 IAM 條件aws:referer可讓您將瀏覽器存取資源限制為 URL 或 URL 首碼清單。下列範例允許存取僅RasterEsriImagery從網站命名的地圖資源example.com

    警告

    雖然aws:referer可以限制訪問,但它不是一個安全的機制。包含公開已知推薦者標頭值相當危險。未授權方可以使用修改的或自訂瀏覽器來提供他們選擇的任何 aws:referer 值。因此,不aws:referer應用於防止未經授權的人士提出直接 AWS 要求。它僅用於允許客戶保護其數位內容 (例如存放在 Amazon S3 中的內容),使其不被未經授權的第三方網站參考。有關更多信息,請參閱:裁判員。AWS

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:GetMap*", "Resource": "arn:aws:geo:us-west-2:111122223333:map/RasterEsriImagery", "Condition": { "StringLike": { "aws:referer": [ "https://example.com/*", "https://www.example.com/*" ] } } } ] }

    如果您使用七巧板顯示地圖,則不會使用地圖 API 傳回的樣式描述元、字符或精靈。而是透過指向包含樣式規則和必要資產的 .zip 檔案進行配置。下列策略授與ExampleMapGetMapTile作業命名的對映資源的唯讀存取權。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "MapsReadOnly", "Effect": "Allow", "Action": [ "geo:GetMapTile" ], "Resource": "arn:aws:geo:region:accountID:map/ExampleMap" } ] }
    Places policy example

    下列策略授與名ExamplePlaceIndex為的地點索引資源的唯讀存取權,該資源可依文字或位置搜尋位置。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "PlacesReadOnly", "Effect": "Allow", "Action": [ "geo:SearchPlaceIndex*", "geo:GetPlace" ], "Resource": "arn:aws:geo:region:accountID:place-index/ExamplePlaceIndex" } ] }

    新增符合的 IAM 條件aws:referer可讓您將瀏覽器存取資源限制為 URL 或 URL 首碼清單。下列範例會拒絕存取ExamplePlaceIndex從所有反向連結網站命名的地點索引資源 (除example.com外)。

    警告

    雖然aws:referer可以限制訪問,但它不是一個安全的機制。包含公開已知推薦者標頭值相當危險。未授權方可以使用修改的或自訂瀏覽器來提供他們選擇的任何 aws:referer 值。因此,不aws:referer應用於防止未經授權的人士提出直接 AWS 要求。它僅用於允許客戶保護其數位內容 (例如存放在 Amazon S3 中的內容),使其不被未經授權的第三方網站參考。有關更多信息,請參閱:裁判員。AWS

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:*", "Resource": "arn:aws:geo:us-west-2:111122223333:place-index/ExamplePlaceIndex", "Condition": { "StringLike": { "aws:referer": [ "https://example.com/*", "https://www.example.com/*" ] } } } ] }
    Trackers policy example

    以下策略授予對名為ExampleTracker更新設備位置的跟踪器資源的訪問權限。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "UpdateDevicePosition", "Effect": "Allow", "Action": [ "geo:BatchUpdateDevicePosition" ], "Resource": "arn:aws:geo:region:accountID:tracker/ExampleTracker" } ] }

    新增符合的 IAM 條件aws:referer可讓您將瀏覽器存取資源限制為 URL 或 URL 首碼清單。下列範例會拒絕存取ExampleTracker從所有反向連結網站命名的追蹤器資源 (除example.com外)。

    警告

    雖然aws:referer可以限制訪問,但它不是一個安全的機制。包含公開已知推薦者標頭值相當危險。未授權方可以使用修改的或自訂瀏覽器來提供他們選擇的任何 aws:referer 值。因此,不aws:referer應用於防止未經授權的人士提出直接 AWS 要求。它僅用於允許客戶保護其數位內容 (例如存放在 Amazon S3 中的內容),使其不被未經授權的第三方網站參考。有關更多信息,請參閱:裁判員。AWS

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:GetDevice*", "Resource": "arn:aws:geo:us-west-2:111122223333:tracker/ExampleTracker", "Condition": { "StringLike": { "aws:referer": [ "https://example.com/*", "https://www.example.com/*" ] } } } ] }
    Routes policy example

    以下策略授予存取名為ExampleCalculator計算路由的路由計算器資源。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "RoutesReadOnly", "Effect": "Allow", "Action": [ "geo:CalculateRoute" ], "Resource": "arn:aws:geo:region:accountID:route-calculator/ExampleCalculator" } ] }

    新增符合的 IAM 條件aws:referer可讓您將瀏覽器存取資源限制為 URL 或 URL 首碼清單。下列範例會拒絕存取ExampleCalculator從所有參照網站命名的路線計算器 (除example.com外)。

    警告

    雖然aws:referer可以限制訪問,但它不是一個安全的機制。包含公開已知推薦者標頭值相當危險。未授權方可以使用修改的或自訂瀏覽器來提供他們選擇的任何 aws:referer 值。因此,不aws:referer應用於防止未經授權的人士提出直接 AWS 要求。它僅用於允許客戶保護其數位內容 (例如存放在 Amazon S3 中的內容),使其不被未經授權的第三方網站參考。有關更多信息,請參閱:裁判員。AWS

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:*", "Resource": "arn:aws:geo:us-west-2:111122223333:route-calculator/ExampleCalculator", "Condition": { "StringLike": { "aws:referer": [ "https://example.com/*", "https://www.example.com/*" ] } } } ] }
    注意

    雖然未驗證身分集區的目的是在不安全的網際網路網站上曝光,但請注意,這些身分集區會被交換成標準、有時間限制 AWS 的認證。

    適當範圍與未驗證身分集區相關聯的 IAM 角色非常重要。

  11. 選擇 [允許] 建立您的身分集區。

產生的身分集區遵循語法 <region>:<GUID>.

例如:

us-east-1:1sample4-5678-90ef-aaaa-1234abcd56ef

如需 Amazon 位置特定的更多政策範例,請參閱Amazon 定 Location Service 的身分識別政策範例

在中使用 Amazon Cognito 身份集區 JavaScript

下列範例會交換您為憑證建立的未驗證身分集區,然後用來擷取地圖資源ExampleMap的樣式描述元。

const AWS = require("aws-sdk"); const credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: "<identity pool ID>" // for example, us-east-1:1sample4-5678-90ef-aaaa-1234abcd56ef }); const client = new AWS.Location({ credentials, region: AWS.config.region || "<region>" }); console.log(await client.getMapStyleDescriptor("ExampleMap").promise());
注意

從未驗證身分擷取的認證有效期為一小時

以下是在認證過期之前自動更新的函數範例。

async function refreshCredentials() { await credentials.refreshPromise(); // schedule the next credential refresh when they're about to expire setTimeout(refreshCredentials, credentials.expireTime - new Date()); }

為了簡化這項工作,您可以使用 Amazon 位置JavaScript 驗證助手。這代替了獲取憑據並刷新它們。此範例使用第三 AWS 版的 JavaScript SDK。

import { LocationClient, GetMapStyleDescriptorCommand } from "@aws-sdk/client-location"; import { withIdentityPoolId } from "@aws/amazon-location-utilities-auth-helper"; const identityPoolId = "<identity pool ID>"; // for example, us-east-1:1sample4-5678-90ef-aaaa-1234abcd56ef // Create an authentication helper instance using credentials from Cognito const authHelper = await withIdentityPoolId(identityPoolId); const client = new LocationClient({ region: "<region>", // The region containing both the identity pool and tracker resource ...authHelper.getLocationClientConfig(), // Provides configuration required to make requests to Amazon Location }); const input = { MapName: "ExampleMap", }; const command = new GetMapStyleDescriptorCommand(input); console.log(await client.send(command));

後續步驟