1

我正在尝试为我的移动应用使用AWS Cognito(用户池)和AWS DynamoDB。如何通过认证的认证用户(用户池)在swift中访问DynamoDB

我做了以下内容:

  1. 在AWS上Cognito创建用户池。
  2. 在AWS Cognito上创建标识池,并在身份验证提供程序上将用户池标识,应用程序客户端标识设置为Cognito。
  3. 在AWS DynamoDB上创建SampleTable。
  4. 设置权限已通过身份验证的角色以访问AWS IAM上的SampleTable。

我创造了这个代码:

let userPoolConfigration = AWSServiceConfiguration.init(region: AWSRegionType.USEast1, credentialsProvider: nil) 
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = userPoolConfigration 

let userServiceConfigration = AWSCognitoIdentityUserPoolConfiguration.init(clientId: "(client id from user pool)", clientSecret: "(client secret from user pool)", poolId: "(user pool id from user pool)") 

AWSCognitoIdentityUserPool.registerCognitoIdentityUserPoolWithUserPoolConfiguration(userServiceConfigration, forKey: "AmazonCognitoIdentityProvider") 
let pool = AWSCognitoIdentityUserPool(forKey: "AmazonCognitoIdentityProvider") 

    let user = pool.getUser("sampleuser") 
    user.getSession("sampleuser", password: "samplepassword", validationData: nil, scopes: nil).continueWithBlock({ task in 
     if (task.error == nil) { 
      let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1, 
       identityPoolId:"(identity id from identity pool)") 

      let ret = task.result as! AWSCognitoIdentityUserSession 
      let logins: NSDictionary = NSDictionary(dictionary: ["cognito-idp.us-east-1.amazonaws.com/(user pool id from user pool)" : ret.idToken!.tokenString]) 
      credentialsProvider.logins = logins as [NSObject : AnyObject] 
      let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider) 
      AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 
      credentialsProvider.clearKeychain() 
      credentialsProvider.credentials().continueWithBlock {(task: AWSTask!) -> AnyObject! in 
       let result = task.result as! AWSCredentials 
       let newcredentialsProvider = AWSStaticCredentialsProvider(accessKey:result.accessKey, secretKey: result.secretKey) 
       let newdefaultServiceConfiguration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: newcredentialsProvider) 
       AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = newdefaultServiceConfiguration 

       let dynamoDBObjectMapper = AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper() 
       let scanExpression = AWSDynamoDBScanExpression() 

       dynamoDBObjectMapper.scan(SampleTable.self, expression: scanExpression).continueWithBlock({ task in 
        print(task.result) 
        return nil 
       }) 
       return nil 
      } 
     } 
     return nil 
    }) 

但我得到这个错误时, “dynamoDBObjectMapper.scan()” 已运行:

2016-06-23 16:57:04.988 AWSiOSSDK v2.4.3 [Debug] AWSURLSessionManager.m line:525 | -[AWSURLSessionManager printHTTPHeadersAndBodyForRequest:] | Request headers: 
{ 
    "Content-Type" = "application/x-amz-json-1.0"; 
    Host = "dynamodb.us-east-1.amazonaws.com"; 
    "User-Agent" = "aws-sdk-iOS/2.4.3 iPhone-OS/9.2 en_US mapper"; 
    "X-Amz-Date" = 20160623T075704Z; 
    "X-Amz-Target" = "DynamoDB_20120810.Scan"; 
} 
2016-06-23 16:57:04.988 if-she[3704:367618] AWSiOSSDK v2.4.3 [Debug] AWSURLSessionManager.m line:542 | -[AWSURLSessionManager printHTTPHeadersAndBodyForRequest:] | Request body: 
{"TableName":"SampleTable"} 
2016-06-23 16:57:05.844 AWSiOSSDK v2.4.3 [Debug] AWSURLSessionManager.m line:552 | -[AWSURLSessionManager printHTTPHeadersForResponse:] | Response headers: 
{ 
    Connection = "keep-alive"; 
    "Content-Length" = 125; 
    "Content-Type" = "application/x-amz-json-1.0"; 
    Date = "Thu, 23 Jun 2016 07:57:05 GMT"; 
    Server = Server; 
    "x-amz-crc32" = 2088342776; 
    "x-amzn-RequestId" = FPM78JRBQIKG2DOLI62SL4IRMFVV4KQNSO5AEMVJF66Q9ASUAAJG; 
} 
2016-06-23 16:57:05.845 AWSiOSSDK v2.4.3 [Debug] AWSURLResponseSerialization.m line:63 | -[AWSJSONResponseSerializer responseObjectForResponse:originalRequest:currentRequest:data:error:] | Response body: 
{"__type":"com.amazon.coral.service#MissingAuthenticationTokenException","message":"Request is missing Authentication Token"} 

也许我缺少了如何使用身份验证令牌。 我的代码有什么问题?

谢谢。

回答

0

你可以尝试添加会话令牌到newcredentialsProvider?结果中会包含访问密钥和密钥。

除此之外,一旦您将Cognito凭证提供程序添加为defaultServiceConfiguration,则不需要明确地获取凭证。您可以直接创建dynamoDBObjectMapper实例,SDK在调用Dynamo或任何其他AWS服务时将自动从Cognito中提取临时凭证。

+0

谢谢您的回复。 AWSStaticCredentialsProvider的初始化方法没有参数sessionKey。 因此,我删除代码“初始化AWSStaticCredentialsProvider”和“注册defaultServiceConfiguration它” 但我得到了同样的错误。 – hiro