gpt4 book ai didi

ios - 在 didFinishLaunchingWithOptions 中检查无效的用户 token firebase

转载 作者:行者123 更新时间:2023-11-28 23:41:13 26 4
gpt4 key购买 nike

根据 Google 支持,检测已撤销的 firebase token 的唯一方法是向我的 Firestore 发出读取请求并收回FIRAuthErrorCodeUserTokenExpired 错误。

我在我的 iOS 应用程序的 didFinishLaunchingWithOptions() 中尝试过。数据读取正确,但应该有错误,因为我停用了测试用户帐户( token 应该被撤销)。不幸的是,Firebase 仍然处理请求并登录用户而没有抛出错误。

对于一个应该尽可能安全的应用程序,如果您在应用程序中保持登录状态,尽管您的 token 已经被撤销,这是非常次优的。

这是我的代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
window = UIWindow()
if Auth.auth().currentUser == nil { // check if there is a User logged in
window?.rootViewController = LoginViewController() // set the MainTabBarController as the root (start) controller
} else{
if let uid = Auth.auth().currentUser?.uid{
let firRef = Firestore.firestore().collection("idols").document(uid)
firRef.getDocument { (document, error) in
if let err = error {
print(err)
self.window?.rootViewController = LoginViewController()
}else{
guard let doc = document, let data = doc.data() else {return}
guard let username = data["username"] as? String, let uid = data["uid"] as? String, let biography = data["biography"] as? String else {return}
self.activeUser = User(uid: String(uid), username: username, biography: biography)
print(self.activeUser)
self.window?.rootViewController = MainTabBarController()
}
}
}
window?.rootViewController = LoginViewController()
}


return true
}

这是我的 Firebase 规则:

service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}

我知道规则还没有完全调整好,但在我看来,Firebase 应该抛出一个错误,因为 token 已过期。我知道我还没有检查正确的错误,但是无论如何都不会调用 if let

我检查了多个资源,包括 Firebase documentation对应于此主题,但文档仅涵盖如何检测网络中的已撤销 token ,而不涉及 iOS 或 Android。

除此之外,我检查了一个 stack overflow条目,但它没有有用的正确答案,所以我决定在这里发布我自己的答案:

有谁知道如何在 iOS 上立即检测已撤销 token 的正确方法?

如果这个问题没有完美表述,我很抱歉。我对堆栈溢出还是个新手,所以请多关照:)

最佳答案

我找到了以下解决方案:

didFinishLaunchingWithOptions中添加如下代码:

if Auth.auth?.currentUser == nil {
// You need to prompt the user login interface
} else {
Auth.auth().currentUser?.reload(completion: { (error) in
if error != nil {
if let err = error as NSError?{
if let error = AuthErrorCode(rawValue: err.code){
switch error{
// You need to prompt the user login interface
case .invalidCredential: print("Invalid credentials")
case .invalidUserToken: print("Invalid User Token")
case .userTokenExpired: print("User Token Expired")
case .invalidCustomToken: print("Invalid Custom Token")
case .customTokenMismatch: print("Custom token mismatch")
case .userDisabled: print("User disabled")
case .userNotFound: print("User not found")
default: print("call default error")
}
}
}
}
else {
print("Valid Token")
}
})
}

啊,不要忘记在运行此代码之前初始化 Firebase(否则您将无法访问 Firebase Auth)

关于ios - 在 didFinishLaunchingWithOptions 中检查无效的用户 token firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com