Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

获取凭证

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。本部分介绍如何获取凭证以及如何从身份池检索 Amazon Cognito 身份。

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

Amazon Cognito 身份并非凭证。可以在 AWS Security Token Service (AWS STS) 中使用 Web 联合身份验证支持来用它们交换凭证。建议使用 AWS.CognitoIdentityCredentials 来为您的应用程序用户获得 AWS 凭证。然后,使用 AWS STS 用凭证对象中的身份交换凭证。

注意

如果您的身份池是在 2015 年 2 月前创建的,则您需要将您的角色与身份池重新关联,以便在没有角色作为参数的情况下使用 AWS.CognitoIdentityCredentials 构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

Android

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要向应用程序提供 AWS 凭证,请按照以下步骤操作。

  1. Amazon Cognito 控制台中选择管理联合身份,创建一个身份池并复制启动器代码段。

  2. 如果您尚未完成此操作,请将 适用于 Android 的 AWS 移动软件开发工具包 添加到您的项目中。有关说明,请参阅设置适用于 Android 的 移动软件开发工具包

  3. 包括以下导入语句:

    import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.regions.Regions;
  4. 使用 Amazon Cognito 控制台生成的代码段初始化 Amazon Cognito 凭证提供程序。IDENTITY_POOL_ID 的值将特定于您的账户:

    CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( getApplicationContext(), // Context "IDENTITY_POOL_ID", // Identity Pool ID Regions.US_EAST_1 // Region );
  5. 将初始化的 Amazon Cognito 凭证提供程序传递到要使用的 AWS 客户端的构造函数中。所需的代码取决于要初始化的服务。客户端将使用此提供程序获取用于访问 AWS 资源的凭证。

    注意

    如果您在 2015 年 2 月之前创建了身份池,您将需要将您的角色与身份池重新关联,才能在没有角色作为参数的情况下使用此构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

检索 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)起,如果您在应用程序的主线程上执行网络 I/O,您的应用程序将自动失败并引发 NetworkOnMainThreadException。您将需要使用 AsyncTask 将您的代码移至后台线程。有关更多信息,请参阅 Android 文档。您也可以调用 getCachedIdentityId() 以检索 ID,但前提是已缓存在本地。否则,该方法将返回 null 值。

iOS - Objective-C

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。Amazon Cognito 身份池同时支持经过身份验证和未经身份验证的身份。要向应用程序提供 AWS 凭证,请按照以下步骤操作。

  1. Amazon Cognito 控制台中选择管理联合身份,创建一个身份池并复制启动器代码段。

  2. 如果您尚未完成此操作,请将 AWS Mobile SDK for iOS 添加到您的项目中。有关说明,请参阅设置Mobile SDK for iOS

  3. 在您的源代码中,请包括 AWSCore 标头:

    #import <AWSCore/AWSCore.h>
  4. 使用 Amazon Cognito 控制台生成的代码段初始化 Amazon Cognito 凭证提供程序。IDENTITY_POOL_ID 的值将特定于您的账户:

    AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"IDENTITY_POOL_ID"]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;

    注意

    如果您在 2015 年 2 月之前创建了身份池,您将需要将您的角色与身份池重新关联,才能在没有角色作为参数的情况下使用此构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

检索 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。有关更多信息,请参阅 Mobile SDK for iOS API 参考

iOS - Swift

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要向应用程序提供 AWS 凭证,请按照以下步骤操作。

  1. Amazon Cognito 控制台中选择管理联合身份,创建一个身份池并复制启动器代码段。

  2. 如果您尚未完成此操作,请将 Mobile SDK for iOS 添加到您的项目中。有关说明,请参阅设置适用于 iOS 的开发工具包

  3. 在您的源代码中,请包括 AWSCore 标头:

    import AWSCore
  4. 使用 Amazon Cognito 控制台生成的代码段初始化 Amazon Cognito 凭证提供程序。IDENTITY_POOL_ID 的值将特定于您的账户:

    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast1, identityPoolId: "IDENTITY_POOL_ID") let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = configuration

    注意

    如果您在 2015 年 2 月之前创建了身份池,您将需要将您的角色与身份池重新关联,才能在没有角色作为参数的情况下使用此构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

检索 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。有关更多信息,请参阅 Mobile SDK for iOS API 参考

JavaScript

如果您尚未创建身份池,则在使用 AWS.CognitoIdentityCredentials 之前,先在 Amazon Cognito 控制台中创建一个身份池。

通过您的身份提供商配置身份池后,您可以使用 AWS.CognitoIdentityCredentials 验证用户身份。要将应用程序凭证配置为使用 AWS.CognitoIdentityCredentials,则为 credentials 或基于每个服务配置设置 AWS.Config 属性。以下示例使用 AWS.Config

// Set the region where your identity pool exists (us-east-1, eu-west-1) AWS.config.region = 'us-east-1'; // Configure the credentials provider to use your identity pool AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { // optional tokens, used for authenticated login 'graph.facebook.com': 'FBTOKEN', 'www.amazon.com': 'AMAZONTOKEN', 'accounts.google.com': 'GOOGLETOKEN' } }); // Make the call to obtain credentials AWS.config.credentials.get(function(){ // Credentials will be available when this function is called. var accessKeyId = AWS.config.credentials.accessKeyId; var secretAccessKey = AWS.config.credentials.secretAccessKey; var sessionToken = AWS.config.credentials.sessionToken; });

可选的 Logins 属性是身份提供商名称到这些提供商身份令牌的映射。您如何从身份提供商获得令牌的方式取决于您使用的提供商。例如,如果 Facebook 是您的身份提供商之一,则您可以使用来自 Facebook 开发工具包FB.login 函数获取身份提供商令牌:

FB.login(function (response) { if (response.authResponse) { // logged in AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030', Logins: { 'graph.facebook.com': response.authResponse.accessToken } }); console.log('You are now logged in.'); } else { console.log('There was a problem logging you in.'); } });

检索 Amazon Cognito 身份

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌 (如果您正在对用户进行身份验证),则可以立即检索最终用户的唯一 Amazon Cognito 标识符 (身份 ID):

var identityId = AWS.config.credentials.identityId;

Unity

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要向应用程序提供 AWS 凭证,请按照以下步骤操作。

  1. Amazon Cognito 控制台中选择管理联合身份,创建一个身份池并复制启动器代码段。

  2. 如果您尚未执行此操作,请下载适用于 Unity 的 AWS 移动开发工具包程序包并将其导入您的项目。您可以通过菜单“Assets”>“Import Package”>“Custom Package”执行此操作。

  3. 将控制台中的启动器代码段粘贴到要从中调用 Amazon Cognito 的脚本中。IDENTITY_POOL_ID 的值将特定于您的账户:

    CognitoAWSCredentials credentials = new CognitoAWSCredentials ( "IDENTITY_POOL_ID", // Cognito Identity Pool ID RegionEndpoint.USEast1 // Region );
  4. 将初始化的 Amazon Cognito 凭证传递到要使用的 AWS 客户端的构造函数中。所需的代码取决于要初始化的服务。客户端将使用此提供程序获取用于访问 AWS 资源的凭证。

    注意

    如果您在 2015 年 2 月之前创建了身份池,您将需要将您的角色与身份池重新关联,才能在没有角色作为参数的情况下使用此构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

检索 Amazon Cognito 身份

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌 (如果您正在对用户进行身份验证),则可以立即检索最终用户的唯一 Amazon Cognito 标识符 (身份 ID):

credentials.GetIdentityIdAsync(delegate(AmazonCognitoIdentityResult<string> result) { if (result.Exception != null) { //Exception! } string identityId = result.Response; });

Xamarin

您可以使用 Amazon Cognito 将具有有限权限的临时凭证传输到应用程序,以便您的用户访问 AWS 资源。Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要向应用程序提供 AWS 凭证,请按照以下步骤操作。

  1. Amazon Cognito 控制台中选择管理联合身份,创建一个身份池并复制启动器代码段。

  2. 如果您尚未执行此操作,请将适用于 Xamarin 的 AWS 移动开发工具包添加到您的项目中。有关说明,请参阅设置适用于 Xamarin 的开发工具包

  3. 包括以下使用语句:

    using Amazon.CognitoIdentity;
  4. 将控制台中的启动器代码段粘贴到要从中调用 Amazon Cognito 的脚本中。IDENTITY_POOL_ID 的值将特定于您的账户:

    CognitoAWSCredentials credentials = new CognitoAWSCredentials ( "IDENTITY_POOL_ID", // Cognito Identity Pool ID RegionEndpoint.USEast1 // Region );
  5. 将初始化的 Amazon Cognito 凭证传递到要使用的 AWS 客户端的构造函数中。所需的代码取决于要初始化的服务。客户端将使用此提供程序获取用于访问 AWS 资源的凭证。

注意

注意:如果您在 2015 年 2 月之前创建了身份池,您将需要将您的角色与身份池重新关联,才能在没有角色作为参数的情况下使用此构造函数。为此,请打开 Amazon Cognito 控制台,选择管理联合身份,选择您的身份池,然后选择编辑身份池,指定您的经过身份验证的角色和未经身份验证的角色,然后保存更改。

检索 Amazon Cognito 身份

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌 (如果您正在对用户进行身份验证),则可以立即检索最终用户的唯一 Amazon Cognito 标识符 (身份 ID):

var identityId = await credentials.GetIdentityIdAsync();