首页 文章

处理从用于节点身份验证的iOS生成的Firebase中的一小时令牌到期

提问于
浏览
1

我的申请流程:

通过iOS登录Firebase . 检索firebase令牌并存储在钥匙串中 -

FIRAuth.auth()?.currentUser?.getTokenWithCompletion({ (token, err) in
  //store token in keychain
})

此标记在标头中发送到我的节点服务器以验证请求 -

firebase.auth().verifyIdToken(firebaseAccessToken).then(function(decodedToken) {
  //allow access to api
}

然后令牌在一小时后过期 . 我的问题是我该如何处理?

  • 存储在客户端上检索令牌的时间,并在需要时强制刷新

  • 刷新每个API调用的令牌

  • 使用令牌进行身份验证,然后创建另一个具有更长到期时间的令牌服务器端并将其存储为身份验证令牌

或者这里有另一种选择吗?

2 回答

  • 0

    手动将令牌存储在钥匙串上有效地打击 - 并错误地重新实现 - Firebase SDK提供的行为 . 你不应该首先这样做 .

    然后,第二个选项是最干净的:每次调用后端服务之前调用 getTokenWithCompletion . 这是一个便宜的电话,因为它只会在令牌过期时刷新令牌 .

  • 2

    在我使用Firebase 5的iOS应用程序中,我通过实现IDTokenDidChangeListener()来处理Firebase身份验证令牌的60分钟到期 . 监听器在令牌过期时触发,然后getTokenID()返回刷新的令牌:

    import FirebaseAuth
    
    class UserAuthorizer {
        var tokenChangeListener: IDTokenDidChangeListenerHandle?
    ...
    ...
    ...
        // Create a listener for token expiration so the token can be renewed.
        self.tokenChangeListener = Auth.auth().addIDTokenDidChangeListener() { (auth, user) in
            if let user = user {
                    // Get the token, renewing it if the 60 minute expiration
                    //  has occurred.
                    user.getIDToken { idToken, error in
                        if let error = error {
                            // Handle error
                            print("getIDToken error: \(error)")
                            return;
                        }
    
                        print("getIDToken token: \(String(describing: idToken))")
    
                        // Reauthorize Firebase with the new token: idToken
                        …
                        …
                        …
                    }
                }
            }
    ...
    ...
    ...
        //
        // Sign-Out Firebase.                                                       
        //
        func signOut() {
            …
            …
            …       
            // Remove the token ID listenter.
            guard let tokenListener = self.tokenChangeListener else { return }
            Auth.auth().removeStateDidChangeListener(tokenListener)
            self.tokenChangeListener = nil
        }
    

相关问题