当前位置: 首页 > 知识库问答 >
问题:

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

宗波涛
2023-03-14

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

我做了以下工作:

  1. 在AWS Cognito上创建用户池。
  2. 在AWS Cognito上创建身份池,并将用户池ID、应用客户端ID设置为身份验证提供商上的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
    })

但我在运行“dynamodbobObjectMapper.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个答案

罗昱
2023-03-14

是否可以尝试将会话令牌添加到新凭据提供程序?您将在结果中包含此项以及访问密钥和密钥。

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

 类似资料:
  • 我的代码在这里:代码重新发布是因为我想问一个更直接的问题。如何在未经身份验证的用户和经过身份验证的用户之间切换?我的未经验证的文件似乎已缓存,我使用了以下方法: 在我剩下的api代码之前,它仍然不能工作。谢谢你的帮助 注意:我知道它不起作用,因为我在切换配置/凭据提供程序后立即使用lambda进行调用,并且只有授权用户才能调用此方法。 编辑@behrooziAWS答案: API代码: 完整错误:B

  • 所以我已经成功地验证了用户与Cognito中的用户池。根据我的理解,现在在我们利用任何AWS服务(Dynamodb,S3等)之前,我们需要再次从AWS Cognito Credential提供商获得。 Cognito用户池(验证)用户登录 通过配置AWSCOgnitoRedentialsProvider获取CognitoID 为我们想要与之交互的任何服务制作AWS CAL 从用户PoolID委托成

  • 问题内容: 你可以在模板方面知道当前用户是否已通过身份验证: 但是我没有找到获取经过身份验证的用户列表的方法。 问题答案: 与rz的答案一起,你可以查询未到期的会话模型,然后将会话数据转换为用户。一旦知道了,就可以将其转换为模板标记,该标记可以在任何给定页面上呈现列表。 (这都是未经测试的,但希望将接近工作)。 提取所有已登录的用户… 使用此功能,你可以制作一个简单的包含模板标签… 然后,你可以在

  • 我正在我的Web应用程序中构建聊天功能。我使用jitsi作为我们的聊天服务器。在视频聊天会话中可以有2-4个用户。这些会话将被锁定。Web应用程序将启动聊天,并将控制谁可以加入聊天室。 我试图嵌入jitsi满足内部使用jitsi满足外部API的网页这里列出https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md。 我们的jitsi会议不向

  • 我正在尝试在反应式Spring Boot应用程序中配置Spring Security性,并包括依赖于新的Spring Security版本5.0.0的父项目。RC1: 我将我的Spring WebSecurity配置为使用自定义AuthenticationFilter来检索我的身份验证信息,以及使用我自己的提供者的自定义AuthenticationManager。 配置: ReactiveAuth

  • 所以我在摆弄Cognito和他们在Javascript中的测试用户池功能。我成功地创建用户感谢这里找到的留档: http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html 当我尝试对用户进行身份验证时,会收到一条奇