【问题标题】:iOS Swift, AWS Cognito User Pool, Unable to Refresh Access TokeniOS Swift,AWS Cognito 用户池,无法刷新访问令牌
【发布时间】:2018-08-14 23:21:23
【问题描述】:

查看了没有帮助我解决问题的类似 SO 问题。

我在我们的 iOS 应用程序中使用 AWS Cognito 用户池。我们能够成功创建并登录用户。但是大约一个小时后访问令牌不可用,我从 AWS Cognito 文档中了解到,iOS 开发工具包会自动刷新 (also mentioned here) 并在令牌不可用时获取它,但是我没有看不到这种行为。下面的代码显示了我如何尝试获取访问令牌。

使用 iOS 开发工具包 AWSCognitoIdentityProvider 2.6.7

请告诉我如何解决这个问题。

let mySession = self.pool.currentUser()?.getSession()

guard let accessToken = mySession?.result?.accessToken?.tokenString as? String else {
  print("Unable to obtain access token")
  self.handleSignOut() // Signing out the user since there is no access token       
  return
}

【问题讨论】:

  • 你解决了吗?
  • no.. 如果我解决了这个问题会更新
  • 我也面临同样的问题。什么时候过期很容易看出,但是wtf,为什么几乎没有关于如何刷新会话的有用文档。
  • 您是否能够使用 iOS 的 Refresh Token 解决刷新会话。我找不到相关文档如何使用 AWSCognitoIdentityProvider 刷新会话

标签: swift swift3 aws-cognito


【解决方案1】:

getSession() 返回一个 AWSTask。

您必须在回调中访问tokenString

以下代码适用于我:

self.pool.currentUser()?.getSession().continueWith { task in

    if task.error == nil {
        let session = task.result! as AWSCognitoIdentityUserSession
        guard let accessToken = session.idToken?.tokenString; as? String else {
           print("Unable to obtain access token")
           self.handleSignOut() // Signing out the user since there is no access token       
        }
    }
}

【讨论】:

  • 这会重新验证你的身份吗?
  • 使用 getSession() 方法刷新令牌后不会调用方法。我必须重新运行该应用程序,然后它才能获得 API 响应。有没有什么办法可以在刷新token后继续,不需要重新运行app?
【解决方案2】:

您不应缓存 sessiontokenString。如果您这样做了,AWS 库将无法执行代码来知道它何时到期或何时刷新。根据我的阅读(以及我们对 Android 和 iOS Cognito SDK 所做的),正确的方法是每次需要令牌时调用 getSession()。在后台,AWS 库要么立即返回一个缓存会话,要么执行刷新会话的工作(也就是获取一个新令牌)。

如果您没有从主线程调用 getSession(),您可以阻止从 getSession() 返回的 AWSTask。否则,这可能并非易事,因为您和 AWSTask 将在稍后完成。

您可以检查会话的expirationTime 属性,如果未过期,则使用其中的令牌。但是您仍然要处理会话过期并且 AWS 库需要执行异步工作以刷新的情况。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2016-09-23
    • 2016-12-30
    • 2020-09-28
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-02-22
    相关资源
    最近更新 更多