首页 > 解决方案 > Swift 中的 AWS Cognito getSession 导致来自 API GW 的 401 未授权

问题描述

当我们的应用程序启动时,我们会检查我们是否拥有有效的 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 获取最新的令牌,有时会提供缓存的结果。

标签: swiftaws-lambdaaws-api-gatewayamazon-cognito

解决方案


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


推荐阅读