我申请的流程:
通过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
}
令牌然后在一小时后过期。我的问题是我该如何处理?
或者这里有另一种选择吗?
答案 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
}