2017-04-03 32 views
1

我希望能够拥有一个检查用户是否登录的Bool方法,如果是,则返回要在API标头中使用的标记。如何在允许JWT刷新的情况下检查Swift中的Auth用户?

func isLoggedIn() -> Bool { 
    if let authToken = AuthManager.loadAuthToken() { 
     if authToken.expiration.isGreaterThanDate(Date()) { 
      return true 
     } else { 
      let authAPI = AuthenticationAPI() 

      authAPI.refreshToken(token: authToken.token) { (results) in 
       switch results { 
       case .success(let response): 
        [HAVE PARENT METHOD RETURN TRUE] 
       case .failure: 
        removeAuthToken() 
        [HAVE PARENT METHOD RETURN FALSE] 
       } 
      } 
     } 
    } 

    return false 
} 

我有这主要是合作,但是,我遇到了一堵墙,试图找出如何让应用程序尝试刷新令牌通话时,有一个令牌存在,但它已过期。

信号量似乎是要走的路,但似乎很快使代码复杂化。这是它应该完成的方式,还是有更好的方法,通常是为此而做的?

+0

我会去懒惰评估 - 总是假设它是有效的。在失败时采取行动,并且在不需要时不要在代码中保留状态。 – Michal

回答

2

我采取了不同的方法。

AuthManager类的类中,我将令牌存储在可选的var中。如果令牌存在,那么我认为它在API调用中有效。在令牌的didSet中,有一个Notification.Name.authStatusDidChange通知发送,以便应用程序可以做出相应响应。

如果API调用返回401,则我通知AuthManager清除令牌(触发通知,在我的情况下显示登录流程)。 但是,您可以有其他逻辑,而不是清除令牌,Authmanager首先尝试刷新它。如果刷新成功,则发送不同的通知以重试API请求。否则它会清除令牌并触发登录。

虽然我正在打字 - 就像Michal说的,稍微详细一点。

+0

然后用户将负责再次尝试(因为调用会失败)? – RiddlerDev

+2

就我而言,是的。我想强制重新验证。但是,对于您的情况,您可能会触发异步令牌刷新,如果失败,则会显示重新验证工作流程。如果刷新成功,请重试先前的API请求。 Alamofire有这方面的方法。 – dmorrow

+0

这正是我的意思,但我在手机上而不是电脑上。干杯! – Michal

相关问题