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

时间:2016-12-01 12:20:36

标签: ios node.js firebase firebase-authentication

我申请的流程:

通过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 :(得分:2)

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

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

答案 1 :(得分:0)

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