繁体   English   中英

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

[英]Handling one hour token expiration in Firebase generated from iOS used for node auth

我的申请流程:

通过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调用刷新令牌
  • 使用令牌进行身份验证,然后创建另一个具有更长到期时间的令牌服务器端,并将其存储为身份验证令牌

还是这里还有其他选择?

手动将令牌存储在钥匙串上,可以有效解决(并错误地重新实现)Firebase SDK提供的行为。 首先,您不应该这样做。

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

在使用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
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM