使用 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 为 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 控制台创建身份池

  1. 转到 Amazon Cognito 控制台

  2. 选择 Manage Identity Pools(管理身份池)。

  3. 选择创建新身份池,然后输入身份池的名称。

  4. 未经验证的身份可折叠部分中,选择启用未经验证的身份的访问权限

  5. 选择创建池

  6. 选择您希望用于身份池的 IAM 角色。

  7. 展开查看详情

  8. 未经身份验证的身份下,输入角色名称。

  9. 展开查看策略文档部分,然后选择编辑以添加您的策略。

  10. 添加您的策略来授予对您的资源的访问权限。

    以下是地图、地点、跟踪器和路线的政策示例。要将示例用于您自己的策略,请替换区域account ID 占位符:

    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 前缀列表。以下示例仅允许从网站 example.com 访问名为 RasterEsriImagery 的地图资源:

    警告

    虽然 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/*" ] } } } ] }

    如果你使用 Tangram 来显示地图,它不会使用 Maps API 返回的样式描述符、图像字符或精灵。相反,它是通过指向包含样式规则和必要资产的 .zip 文件来配置的。以下策略授予对ExampleMap为该GetMapTile操作命名的地图资源的只读访问权限。

    { "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 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));

后续步骤