如何在允许JWT Refresh的同时检查Swift中的Auth用户?

时间:2017-04-03 20:02:22

标签: swift asynchronous jwt

我希望能够使用一个Bool方法检查用户是否已登录,如果是,则返回要在API标头中使用的标记。

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
}

我有这个大部分都在工作,但是,当我遇到令牌时,我正试图弄清楚如何允许应用程序尝试刷新令牌调用,但它已过期。

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

1 个答案:

答案 0 :(得分:2)

我采取了不同的方法。

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

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

在我打字的时候 - 就像Michal说的那样,还有更多细节。