使用 Amazon Cognito 身份验证用户身份 - AWS SDK for JavaScript

AWS SDK for JavaScript V3 API 参考指南详细描述了 AWS SDK for JavaScript 版本 3 (V3) 的所有 API 操作。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon Cognito 身份验证用户身份

获取浏览器脚本 AWS 凭证的推荐方法是使用 Amazon Cognito 身份凭证客户端。CognitoIdentityClientAmazon Cognito 支持通过第三方身份提供商对用户进行身份验证。

要使用 Amazon Cognito Identity,您必须先在 Amazon Cognito 控制台中创建一个身份池。身份池表示应用程序为用户提供的身份组。为用户提供的身份唯一地标识每个用户账户。Amazon Cognito 身份并不是凭证。使用 AWS Security Token Service (AWS STS) 中的 Web 联合身份验证支持将它们交换为凭证。

Amazon Cognito 可帮助您管理跨多个身份提供商的身份抽象。然后,在 AWS STS中为凭证交换加载的身份。

配置 Amazon Cognito 身份凭证对象

如果您尚未创建身份池,则在配置 Amazon Cognito 客户端之前,请先创建一个以与 Amazon Cognito 控制台中的浏览器脚本一起使用。为身份池创建并关联经过身份验证和未经身份验证的 IAM 角色。有关更多信息,请参阅《Amazon Cognito 开发人员指南》中的教程:创建身份池

未经身份验证的用户的身份未经过验证,因此,该角色很适合您的应用程序的来宾用户或用户身份验证与否无关紧要的情形。经过身份验证的用户可以通过证实其身份的第三方身份提供商登录到您的应用程序。确保您的资源的权限范围适当,让未经身份验证的用户无权访问这些资源。

配置身份池后,可使用 @aws-sdk/credential-providers 中的 fromCognitoIdentityPool 方法从身份池中检索凭证。在以下创建 Amazon S3 客户端的示例中,将 AWS_REGION 替换为区域,将 IDENTITY_POOL_ID 替换为身份池 ID。

// Import required AWS SDK clients and command for Node.js import {S3Client} from "@aws-sdk/client-s3"; import {fromCognitoIdentityPool} from "@aws-sdk/credential-providers"; const REGION = AWS_REGION; const s3Client = new S3Client({ region: REGION, credentials: fromCognitoIdentityPool({ clientConfig: { region: REGION }, // Configure the underlying CognitoIdentityClient. identityPoolId: 'IDENTITY_POOL_ID', logins: { // Optional tokens, used for authenticated login. }, }) });

可选的 logins 属性是身份提供商名称到这些提供商身份令牌的映射。您如何从身份提供商获得令牌的方式取决于您使用的提供商。例如,如果您使用 Amazon Cognito 用户池作为身份验证提供商,则可以使用类似于以下方法的方法。

// Get the Amazon Cognito ID token for the user. 'getToken()' below. let idToken = getToken(); let COGNITO_ID = "COGNITO_ID"; // 'COGNITO_ID' has the format 'cognito-idp.REGION.amazonaws.com/COGNITO_USER_POOL_ID' let loginData = { [COGNITO_ID]: idToken, }; const s3Client = new S3Client({ region: REGION, credentials: fromCognitoIdentityPool({ clientConfig: { region: REGION }, // Configure the underlying CognitoIdentityClient. identityPoolId: 'IDENTITY_POOL_ID', logins: loginData }) }); // Strips the token ID from the URL after authentication. window.getToken = function () { var idtoken = window.location.href; var idtoken1 = idtoken.split("=")[1]; var idtoken2 = idtoken1.split("&")[0]; var idtoken3 = idtoken2.split("&")[0]; return idtoken3; };

将未经身份验证的用户切换为经过身份验证的用户

Amazon Cognito 同时支持经过身份验证的用户和未经身份验证的用户。即使未经身份验证的用户不通过任何身份提供商登录,这些用户也有权访问您的资源。此级别的访问可用于向尚未登录的用户显示内容。即使每个未经身份验证的用户尚未单独登录和经过身份验证,这些用户在 Amazon Cognito 中也都具有唯一的身份。

最初未经身份验证的用户

用户通常从未经身份验证的角色开始,为此需要设置配置对象的凭证属性而不是 logins 属性。在这种情况下,您的默认凭证可能如下所示:

// Import the required AWS SDK for JavaScript v3 modules. import {fromCognitoIdentityPool} from "@aws-sdk/credential-providers"; // Set the default credentials. const creds = new fromCognitoIdentityPool({ IdentityPoolId: "IDENTITY_POOL_ID", clientConfig({ region: REGION }) // Configure the underlying CognitoIdentityClient. });

切换为经过身份验证的用户

当未经身份验证的用户登录身份提供商并且您拥有令牌时,您可以通过调用可更新凭证对象和添加 logins 令牌的自定义函数,来将用户从未经身份验证的用户切换为经过身份验证的用户。

// Called when an identity provider has a token for a logged in user function userLoggedIn(providerName, token) { creds.params.Logins = creds.params.logins || {}; creds.params.Logins[providerName] = token; // Expire credentials to refresh them on the next request creds.expired = true; }