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

AWS Cognito iOS。注销后出现未经验证的错误

水睿
2023-03-14

我正在使用AWS Cognito,通过MobileHub与iOS应用程序集成,通过Facebook登录。一切正常,直到我注销现有身份并尝试使用另一个FB帐户登录(或甚至使用相同的帐户)。
在这种情况下,每次我调用任何AWS Lambda时,都会出现此错误:

AWSiOSSDK v2.4.9[错误]AWSCredentialsProvider.m行:577。
[AWSCOgnitoredentialsProvider凭据]。
无法刷新。错误为[Error Domain=com.amazonaws.awscognitoidentityerromain Code=8“(null)”UserInfo={{uuuu type=NotAuthorizedException,message=Unauthenticated access不支持此标识池。}]

但如果我终止并重新启动应用程序,一切都会恢复正常。

此错误源于:

从阅读AWS SDK代码中,我看到,发生这种情况是因为认知身份无法从这里的凭据提供商获得登录:

我想这是意料之中的,因为我已经注销了。但问题是,即使在登录FB AWS后,仍然认为我未经授权。从StackOverflow上类似的问题中我看到,过去人们在AWSCOgnitoRedentialsProvider上手动设置登录字典。但现在该属性已被弃用,其他类似属性为只读。

这里是我的AWS设置在App委托didFinishLaunchingAnd Options方法:

let cred = AWSCognitoCredentialsProvider(regionType: .euWest1, identityPoolId: "POOLID")
let config = AWSServiceConfiguration(region: .euWest1, credentialsProvider: cred)
AWSServiceManager.default().defaultServiceConfiguration = config

if let config = config {
       config.timeoutIntervalForRequest = 30
       config.timeoutIntervalForResource = 30
       config.maxRetryCount = 3
       AWSLambdaInvoker.register(with: config, forKey: "key")
}

let mapperConfiguration = AWSDynamoDBObjectMapperConfiguration()
mapperConfiguration.saveBehavior = .updateSkipNullAttributes
AWSDynamoDBObjectMapper.register(with: config!, objectMapperConfiguration: mapperConfiguration, forKey: "updateObjectMapper")

这是注销代码

AWSIdentityManager.defaultIdentityManager().logout { (result, error) in
   if let cp = AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider as? AWSCognitoCredentialsProvider {
           cp.clearKeychain()
   }
       // Open login screen
}

请注意,我尝试了清除钥匙链和不清除钥匙链。结果是一样的。

我真的很感激任何帮助<向你问好,亚历克斯

共有1个答案

黄磊
2023-03-14

您是在logins方法的实现中这样做的吗?

- (AWSTask<NSDictionary<NSString *, NSString *> *> *)logins {
    FBSDKAccessToken* fbToken = [FBSDKAccessToken currentAccessToken];
    if(fbToken){
        NSString *token = fbToken.tokenString;
        return [AWSTask taskWithResult: @{ AWSIdentityProviderFacebook : token }];
    }else{
            return [AWSTask taskWithError:[NSError errorWithDomain:@"Facebook Login"
                                                          code:-1
                                                      userInfo:@{@"error":@"No current Facebook access token"}]];
    }
}

更多细节。

 类似资料:
  • 我在一个组件中有以下内容: 脚本: 因此,我将表单数据提交到我的数据库,然后在成功promise中,我使用它。$refs.form.reset();重新设置我的表单。 但是,我会立即收到错误消息,并且在每次提交后都会收到错误消息: "[Vue警告]:错误在下一个滴答:"TypeError:无法读取属性'长度'的未定义" 和 TypeError:无法读取未定义的属性“length”

  • 问题内容: 我想在用户输入错误的同时在“视图”页面中显示验证错误。可以的是,当用户输入错误时,它不会在数据库中保存任何内容。但是用户视图页面中没有错误消息。如果有人发现错误,请帮助我。 这是控制器: 这是路线: 这是刀片视图页面: 这是错误消息块: 问题答案: 如果您使用的是5.2.27或更高版本,请尝试删除中间件。现在,Laravel会自动将中间件应用于内部的所有路由,如果您尝试手动添加它,则会

  • 任何帮助都会很好! 编辑:我正在使用Java 8

  • 重复的步骤 登录 注销 从服务器登录并获取422无法验证CSRF令牌的真实性 Gems 设计3.5.2 设计令牌\u验证0.1.36 根据其他线程,解决方案是在注销时返回一个新的csrf令牌,然后在客户端的注销成功处理程序中,将XSRF-TOKEN的cookie设置为接收的令牌。我使用的代码如下。有人能告诉我为什么它不起作用吗?最后一个登录请求看起来使用了新的令牌,所以棱角分明的看起来像是从coo

  • 我试图遵循google文档中提供的google日历api nodejs示例(https://developers.google.com/calendar/quickstart/nodejs)若要访问我的主要谷歌日历事件,我会收到以下错误:“超出了未经验证使用的每日限制。继续使用需要注册。” 我知道我正在正确地通过OAuth流程,因为我的具有日历访问权限的项目列在这里:https://myaccou

  • 我正在使用jwt auth在我的API中创建RESTful身份验证资源。当客户端应用程序调用登录资源时,如果用户已登录,则必须使当前令牌无效,从而生成新令牌。 但如果当前令牌被列入黑名单,则会抛出。 如何验证令牌是否被列入黑名单?或者如何正确执行用户“注销”?我试图在jwt auth API源代码上找到,但不存在