Swift 中的 AWS Cognito getSession 导致来自 API GW 的 401 未授权

Posted

技术标签:

【中文标题】Swift 中的 AWS Cognito getSession 导致来自 API GW 的 401 未授权【英文标题】:AWS Cognito getSession in Swift resulting in 401 unauthorized from API GW 【发布时间】:2020-08-11 09:43:29 【问题描述】:

当我们的应用程序启动时,我们会检查我们是否拥有有效的 AWS Cognito 令牌(id、refresh、access)。如果它们不再有效,我们使用 cognito IDP getSession 方法手动获取它们。

因为获取这些令牌需要一些时间,所以我们的应用会继续进行 API 调用,并从 API Gateway 获得 401 未经授权的响应。我们在向用户显示加载指示器的同时执行这些操作。

有没有办法让我们在进行 API 调用之前确保我们收到了有效的令牌?我们现在的技巧是,如果我们收到 401 未经授权的响应,我们会重试。这效率不高,因为我们在令牌刷新时浪费了一个(有时更多)API 调用。

我已经研究过使用 DispatchGroups (GCD) 和 DispatchQueue,但这对我们没有帮助。寻找有关我们如何进一步改进这一点的建议。下面是我们用来刷新令牌的代码:

func getTokens()
        self.user?.getSession().continueOnSuccessWith  (task) -> AnyObject? in
            DispatchQueue.main.async(execute: 
                let idTok = task.result?.idToken?.tokenString ?? "ERR"
                    ... handle received tokens ...
            )
            return nil
        
    

旁注:我们正在将“AWSCognitoIdentityProvider”导入我们的应用程序,我的理解是它应该自动更新令牌,但我没有看到这种行为。但是,当我们运行 getTokens() 函数时,它有时会从 Cognito 获取最新的令牌,有时会提供缓存的结果。

【问题讨论】:

【参考方案1】:

我能够通过触发 AWSTask 中的下一个函数来解决这个问题。不理想但有效。

【讨论】:

以上是关于Swift 中的 AWS Cognito getSession 导致来自 API GW 的 401 未授权的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito 登录 iOS (swift)

将 Cognito 中的用户信息与 AWS Amplify GraphQL 关联

Swift - AWS Cognito 使用 Amplify - 如何在 swift 登录后获取令牌?

AWS Cognito Swift 凭证提供商“不推荐使用登录:使用 AWSIdentityProviderManager”

AWS Cognito 错误:未设置身份验证委托

将Cognito的用户信息与AWS Amplify GraphQL关联起来。