本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Amazon Cognito 允许未经身份验证的访客访问您的应用程序
您可以使用 Amazon Cognito 身份验证作为直接使用 AWS Identity and Access Management (IAM) 进行前端软件开发工具包和直接 HTTPS 请求的替代方案。
出于以下原因,您可能需要使用这种形式的身份验证:
-
未经身份验证的用户——如果您的网站包含匿名用户,则可以使用 Amazon Cognito 身份池。想要了解更多信息,请在 使用 Amazon Cognito 允许未经身份验证的访客访问您的应用程序 上参阅本部分。
-
您自己的身份验证——如果您想使用自己的身份验证流程或组合使用多种身份验证方法,则可以使用 Amazon Cognito 联合身份。想要了解更多信息,请参阅 Amazon Cognito 开发人员指南 中的开始使用联合身份。
Amazon Cognito 为 Web 和移动应用程序提供身份验证、授权和用户管理。您可以使用带有 Amazon Location 的 Amazon Cognito 未经身份验证的身份池作为应用程序检索限定范围内的临时凭证的一种方式。 AWS
想要了解更多信息,请参阅 Amazon Cognito 开发人员指南中的用户池入门。
注意
对于移动开发者,Amazon Location 提供了适用于 iOS 和 Android 的移动身份验证软件开发工具包,有关更多信息,请参阅以下 github 存储库:
创建一个 Amazon Cognito 身份池
您可以创建 Amazon Cognito 身份池,允许未经身份验证的访客通过 Amazon Cognito 控制台、或 Amazon Cognito API AWS CLI访问您的应用程序。
重要
您创建的资源池必须与您正在使用的 Amazon Location Service 资源位于相同 AWS 账户 且所在的 AWS 区域相同。
您可以将与未经身份验证的身份角色关联的 IAM policy 用于以下操作:
-
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 Location 操作将无效,未经身份验证的身份将无法调用这些操作。
使用 Amazon Cognito 控制台创建身份池
-
选择 Manage Identity Pools(管理身份池)。
-
选择创建新身份池,然后输入身份池的名称。
-
从未经验证的身份可折叠部分中,选择启用未经验证的身份的访问权限。
-
选择创建池。
-
选择您希望用于身份池的 IAM 角色。
-
展开查看详情。
-
在未经身份验证的身份下,输入角色名称。
-
展开查看策略文档部分,然后选择编辑以添加您的策略。
-
添加您的策略来授予对您的资源的访问权限。
以下是地图、地点、跟踪器和路线的政策示例。要将示例用于您自己的策略,请替换
区域
和account ID
占位符:注意
虽然未经身份验证的身份池旨在在不安全的互联网站点上公开,但请注意,它们将被交换为标准的、有时间限制 AWS 的凭证。
适当确定与未经身份验证的身份池关联的 IAM 角色的范围很重要。
-
选择允许以创建您的身份池。
生成的身份池遵循以下 <
语法 region
>:<GUID
>.
例如:
us-east-1:1sample4-5678-90ef-aaaa-1234abcd56ef
有关 Amazon Location 的更多策略示例,请参阅 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 Location 身份验证帮助程序。这可以代替获取凭证和刷新凭证。此示例使用适用于 JavaScript v3 的 AWS 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));
后续步骤
-
要修改您的角色,请前往 IAM 控制台
。 -
要管理您的身份池,请前往 Amazon Cognito 控制台
。