如何通过swift中经过身份验证的cognito用户(用户池)访问DynamoDB

时间:2016-06-23 08:25:08

标签: swift amazon-web-services amazon-dynamodb amazon-cognito

我正在尝试将AWS Cognito(用户池)和AWS DynamoDB用于我的移动应用。

我做了以下事情:

  1. 在AWS Cognito上创建用户池。
  2. 在AWS Cognito上创建身份池,并将用户池ID,App Client ID设置为Cognito on Authentication Provider。
  3. 在AWS DynamoDB上创建SampleTable。
  4. 设置权限验证角色以在AWS IAM上访问SampleTable。
  5. 我创建了这段代码:

    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"}
    

    也许我错过了如何使用身份验证令牌。 我的代码出了什么问题?

    感谢。

1 个答案:

答案 0 :(得分:0)

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

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