本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
获取凭证
您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书,以便您的用户可以访问资源。 Amazon 本部分介绍如何获取凭证以及如何从身份池检索 Amazon Cognito 身份。
Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。未经身份验证的用户的身份未经过验证,因此,该角色很适合您的应用程序的来宾用户或用户身份验证与否无关紧要的情形。经过身份验证的用户可以通过第三方身份提供商或证实其身份的用户池登录到您的应用程序。确保您的资源的权限范围适当,让未经身份验证的用户无权访问这些资源。
Amazon Cognito 身份并不是凭证。使用 Amazon Security Token Service (Amazon STS) 中的 Web 联合身份验证支持将它们交换为凭证。要获取应用程序用户的 Amazon 证书,请使用您的 Amazon SDK 的 Cognito 身份池凭证提供商。例如,在 JavaScript (v3) 的 Amazon SDK 中,使用@aws-sdk/credential-providers软件包中的fromCognitoIdentityPool函数。然后使用该身份交换凭证 Amazon STS。
Web 身份凭证提供者是 Amazon SDK 中原定设置凭证提供者链的一部分。要在本地config文件中为 Amazon
SDK 或设置身份池令牌 Amazon CLI,请添加web_identity_token_file个人资料条目。请参阅《软件开发工具包和 Amazon 工具参考指南》中的代入角色凭证提供商。
要详细了解如何在 SDK 中填充 Web 身份凭证,请参阅《SDK 开发人员指南》。为了获得最佳结果,请使用内置的身份池集成开始您的项目 Amazon Amplify。
Amazon 用于通过身份池获取和设置凭证的 SDK 资源
-
《Amplify 开发人员中心》的身份池联合身份验证
(Android) -
《Amplify 开发人员中心》的身份池联合身份验证
(iOS) -
开发者指南中@@ 使用亚马逊 Cognito 身份对用户进行 适用于 JavaScript 的 Amazon SDK 身份验证
-
开发者指南中的@@ 亚马逊 Cognito 凭证提供商 适用于 .NET 的 Amazon SDK
-
在《 适用于 Go 的 Amazon SDK 开发者指南》中@@ 以编程方式指定凭证
-
在《 Amazon SDK for Java 2.x 开发人员指南》的代码中提供临时证书
-
假设 适用于 PHP 的 Amazon SDK 开发者指南中的RoleWithWebIdentityCredentialProvider提供商
-
适用于 Python (Boto3) 的 Amazon SDK 文档中的代入 Web 身份提供者的角色
-
在 适用于 Rust 的 Amazon SDK 开发者指南中@@ 指定您的凭证和默认区域
以下各节提供了一些旧版 Amazon SDK 中的示例代码。
您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书,以便您的用户可以访问资源。 Amazon Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 Amazon 凭据,请按照以下步骤操作。
要在安卓应用程序中使用 Amazon Cognito 身份池,请进行设置。 Amazon Amplify有关更多信息,请参阅《Amplify 开发中心》中的身份验证
检索 Amazon Cognito 身份
如果您允许未经身份验证的用户,则可以立即检索终端用户的唯一 Amazon Cognito 标识符(身份 ID)。如果您正在对用户进行身份验证,则可以在设置完凭证提供程序中的登录令牌后检索身份 ID:
String identityId = credentialsProvider.getIdentityId(); Log.d("LogTag", "my ID is " + identityId);
注意
请勿在应用程序的主线程中调用 getIdentityId()、refresh() 或 getCredentials()。从 Android 3.0(API 级别 11)开始,NetworkOnMainThreadExceptionAsyncTask 将您的代码移至后台线程。有关更多信息,请参阅 Android 文档getCachedIdentityId() 以检索 ID,但前提是已缓存在本地。否则,该方法将返回 null 值。
您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书,以便您的用户可以访问资源。 Amazon Amazon Cognito 身份池同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 Amazon 凭证,请完成以下步骤。
要在 iOS 应用程序中使用 Amazon Cognito 身份池,请进行设置。 Amazon Amplify有关更多信息,请参阅《Amplify 开发中心》中的 Swift 身份验证
检索 Amazon Cognito 身份
如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌(如果您正在对用户进行身份验证),则可以立即检索终端用户的唯一 Amazon Cognito 标识符(身份 ID):
// Retrieve your Amazon Cognito ID [[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); } else { // the task result will contain the identity id NSString *cognitoId = task.result; } return nil; }];
注意
getIdentityId 为异步调用。如果您已在提供程序上设置身份 ID,则可以调用 credentialsProvider.identityId 以检索已缓存在本地的身份。但是,如果您的提供商没有设置身份 ID,则调用将credentialsProvider.identityId返回nil。有关更多信息,请参阅 Amplify iOS SDK 参考
您可以使用 Amazon Cognito 为您的应用程序提供临时的、有限权限的证书,以便您的用户可以访问资源。 Amazon Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 Amazon 凭据,请按照以下步骤操作。
要在 iOS 应用程序中使用 Amazon Cognito 身份池,请进行设置。 Amazon Amplify有关更多信息,请参阅《Amplify 开发中心》中的 Swift 身份验证
检索 Amazon Cognito 身份
如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌(如果您正在对用户进行身份验证),则可以立即检索终端用户的唯一 Amazon Cognito 标识符(身份 ID):
// Retrieve your Amazon Cognito ID credentialsProvider.getIdentityId().continueWith(block: { (task) -> AnyObject? in if (task.error != nil) { print("Error: " + task.error!.localizedDescription) } else { // the task result will contain the identity id let cognitoId = task.result! print("Cognito id: \(cognitoId)") } return task; })
注意
getIdentityId 为异步调用。如果您已在提供程序上设置身份 ID,则可以调用 credentialsProvider.identityId 以检索已缓存在本地的身份。但是,如果您的提供商没有设置身份 ID,则调用将credentialsProvider.identityId返回nil。有关更多信息,请参阅 Amplify iOS SDK 参考
如果您尚未创建身份池,则在使用 fromCognitoIdentityPool 之前,先在 Amazon Cognito 控制台
使用身份提供商配置身份池后,您可以使用@aws-sdk/credential-providers软件包中的fromCognitoIdentityPool功能对用户进行身份验证。与其设置全局凭证提供程序AWS.config.credentials,不如通过其credentials属性将凭证提供程序直接附加到每个服务客户端。v3 SDK 在客户端第一次发出请求时会延迟解析提供程序,因此无需单独调用来获取凭证。以下示例将提供程序附加到S3Client:
import { S3Client } from "@aws-sdk/client-s3"; import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers"; // Set the region where your identity pool exists (for example, us-east-1 or eu-west-1) const region = "REGION"; // Attach the credentials provider to your service client const client = new S3Client({ region, credentials: fromCognitoIdentityPool({ identityPoolId: "IDENTITY_POOL_ID", logins: { // optional tokens, used for authenticated login "graph.facebook.com": "FBTOKEN", "www.amazon.com": "AMAZONTOKEN", "accounts.google.com": "GOOGLETOKEN", "appleid.apple.com": "APPLETOKEN" }, clientConfig: { region }, }), }); // Credentials are resolved lazily when the client first makes a request. // To inspect them directly, call the provider and await the result // (from inside an async function): const credentials = await client.config.credentials(); const { accessKeyId, secretAccessKey, sessionToken } = credentials;
可选的 logins 属性是身份提供商名称到这些提供商身份令牌的映射。您如何从身份提供商获得令牌的方式取决于您使用的提供商。例如,如果 Facebook 是您的身份提供商之一,则您可以使用来自 Facebook 软件开发工具包FB.login 函数获取身份提供商令牌:
FB.login(function (response) { if (response.authResponse) { // logged in const region = "us-east-1"; const client = new S3Client({ region, credentials: fromCognitoIdentityPool({ identityPoolId: "us-east-1:1699ebc0-7900-4099-b910-2df94f52a030", logins: { "graph.facebook.com": response.authResponse.accessToken }, clientConfig: { region }, }), }); console.log('You are now logged in.'); } else { console.log('There was a problem logging you in.'); } });
检索 Amazon Cognito 身份
您可以检索最终用户的唯一亚马逊 Cognito 标识符(身份 ID)。如果您允许未经身份验证的用户,则可以立即将其检索。如果您对用户进行身份验证,请在设置登录令牌后将其检索。fromCognitoIdentityPool提供程序在其解析的凭据identityId上公开,因此您可以从使用该提供程序的客户端的已解析凭据中读取它:
// Inside an async function: const { identityId } = await client.config.credentials();
您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书,以便您的用户可以访问资源。 Amazon Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 Amazon 凭据,请按照以下步骤操作。
适用于 Unity 的Amazon SDK 现在是 适用于 .NET 的 Amazon SDK 的一部分。要开始使用中的亚马逊 Cognito 适用于 .NET 的 Amazon SDK,请参阅开发者指南中的亚马逊 Cognito 凭证提供商。 适用于 .NET 的 Amazon SDK 或者,请参阅 Amplify 开发者中心
检索 Amazon Cognito 身份
如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌(如果您正在对用户进行身份验证),则可以立即检索终端用户的唯一 Amazon Cognito 标识符(身份 ID):
string identityId = await credentials.GetIdentityIdAsync();