使用 Amazon Cognito Identity 验证用户身份 - Amazon SDK for JavaScript
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

帮助我们改进Amazon SDK for JavaScript版本 3 (V3) 文档,方法是使用反馈链接,或者在上创建议题或拉取请求GitHub.

这些区域有:Amazon SDK for JavaScriptV3 API 参考指南详细描述了Amazon SDK for JavaScript版本 3 (V3)。

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

使用 Amazon Cognito Identity 验证用户身份

推荐的获取方法Amazon浏览器脚本的凭据是使用 Amazon Cognito 身份凭证客户端CognitoIdentityClient. Amazon Cognito 通过第三方身份提供商启用用户身份验证。

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

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

配置 Amazon Cognito Identity 凭证对象

如果您尚未创建身份池,则在Amazon Cognito 控制台在配置 Amazon Cognito 客户端之前。为身份池创建和关联经过身份验证和未经身份验证的 IAM 角色。有关更多信息,请参阅 https://docs.amazonaws.cn/cognito/latest/developerguide/tutorial-create-identity-pool.html

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

配置身份池后,请使用fromCognitoIdentityPool方法来自@aws-sdk/credential-providers从身份池中检索凭证。如下例 Amazon S3:us-west-2 Amazon中的用户的区域IDENTITY_POOL_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 Amazon 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; }