通过BasicAWSCredentials和CognitoAWSCredentials初始化amazon aws cognito客户端

时间:2016-08-10 22:54:15

标签: amazon-web-services identity credentials amazon-cognito

这两种初始化新AmazonCognitoIdentityClient的方法有什么区别?

dmerge=merge( data1,data2, by=c("Id", "Id") )
 table( dmerge$Id, dmerge$Type )
 #-----------------------  
      Call Email NA Update Visit
  10121    0     1  0      0     0
  10122    0     1  0      0     0
  10123    0     1  0      0     0
  10124    0     1  0      0     0
  10125    0     1  0      0     0
  10126    0     1  0      0     0
  10127    0     2  2      0     0
  10129    0     0  0      1     0
  10130    0     0  0      1     0
    trimming the rest of a long table.....

-

AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient(
    new BasicAWSCredentials("access_key_id", "secret_access_key")
);
identityClient.GetOpenIdTokenForDeveloperIdentity()

虽然互联网上的大多数示例都显示BasicAWSCredentials用于实例化CognitoIdentityClient,但文档中的方法签名表示它接受AmazonCognitoIdentity identityClient = new AmazonCognitoIdentityClient( new CognitoAWSCredentials ("IDENTITY_POOL_ID", "REGION_NAME"); ); identityClient.GetOpenIdTokenForDeveloperIdentity() 类 - AWSCredentialsBasicAWSCredentials都是CognitoAWSCredentials类的子类。因此,我假设两者都应该正常工作,我猜???

我试图了解这种差异将如何影响以下内容:

  • 特权,
  • 超时,
  • 等?

cognitoIdentityClient构造函数的API参考位于:http://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=CognitoIdentity/TCognitoIdentityCognitoIdentityClient.html&tocid=Amazon_CognitoIdentity_AmazonCognitoIdentityClient

2 个答案:

答案 0 :(得分:2)

在客户端设备中,您应使用AmazonCognitoIdentityClient实例化CognitoAWSCredentials客户端。使用STS服务,AWS客户端将获取临时凭证,使客户端承担您先前在身份池中定义的角色。通常,此角色对AWS资源的访问权限非常有限。 (S3上传到特定的水桶等)这就像给人们一种特殊类型的车钥匙,它只能打开音乐系统,而不是发动机。

另一方面,GetOpenIdTokenForDeveloperIdentity是一个特殊的API调用,需要开发人员凭据。您永远不应将开发人员凭据部署到任何客户端设备,您应该只将其保留在您的服务器上。使用服务器上的开发人员凭据实例化AmazonCognitoIdentityClient后,您可以为客户端公开REST端点以获取OpenId令牌(对于给定的身份ID或创建新的身份ID)。假设您的用户使用他们的用户名和密码登录到您的API,并为他们返回一个存储在您的数据库中的自定义访问令牌。之后,您的端点可以实现此逻辑:

  1. 使用自定义令牌(用户ID,用户名,电子邮件等)为您的用户提取唯一标识符
  2. 使用LookupDeveloperIdentity并找出给定用户名的identityId。
  3. 使用找到的identityId GetOpenIdTokenForDeveloperIdentity并发送回客户端。所以他们可以"登录"到那个身份。
  4. 如果此用户没有为其用户名分配任何identityId,请创建一个新用户并发回。
  5. 正如您所见,开发人员AWS令牌正在启用一些敏感的API调用。现在让我们假设客户端具有开发人员访问令牌,因此可以访问GetOpenIdTokenForDeveloperIdentity。然后他们就能够生成OpenId令牌,轻松切换到其他人的身份并访问他们的私人数据。

    如果您不使用开发人员身份验证身份(https://docs.aws.amazon.com/cognito/latest/developerguide/developer-authenticated-identities.html),则不需要GetOpenIdTokenForDeveloperIdentity机制。如果您只使用公共身份验证方法(Twitter,Facebook等),则应忽略第二段并使用CognitoAWSCredentials

答案 1 :(得分:0)

如Çağatay的回答所述,BasicAwsCredentials使用您的开发人员凭据进行实例化。他描述的何时使用每个构造函数在开发人员身份验证身份以外的每种情况下都是绝对正确的。

由于此代码将部署在后端服务上,因此它的曝光不再是一个问题。移动客户端将与此服务器通信并从中获取令牌,用户将获得凭据。凭据永远不会以此模式向用户公开。

正如您在Cognito documentation中看到的,示例中有BasicAwsCredentials。在this blog post中可以看到端到端样本。