[firebase_auth]: authStateChanges() never emits null when the user is force-signed-out before the stream is listened to (iOS, macOS, Android)
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 15/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Đình trệ
- Lĩnh vực
- authentication, mobile
Hướng nghiên cứu
Work is already in progress: pull request #18797 is open against this issue, so review or build on it rather than starting a parallel fix. The first-callback handling lives in FLTAuthStateChannelStreamHandler.swift and FLTIdTokenChannelStreamHandler.swift (iOS and macOS) and in AuthStateChannelStreamHandler.kt and IdTokenChannelStreamHandler.kt (Android), with the Dart side in the auth state handlers. Done means a null first callback reaches Dart, a normal signed-in launch is unchanged, and the 'fires once on first initialization' test still passes.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Is there an existing issue for this? I have searched the existing issues. #10230 is related, but it covers a running app with no token refresh.
Which plugins are affected? Auth
Which platforms are affected? Android, iOS, macOS
Description
If Firebase Auth signs the user out on its own before the app listens to authStateChanges() or idTokenChanges(), the Dart side never finds out. FirebaseAuth.instance.currentUser keeps returning the old user for the rest of the process, and all three streams keep emitting that user. Calls that need a token fail with [firebase_auth/no-current-user], Firestore rejects every request with permission-denied, and the app stays on its signed-in UI.
The usual trigger is a revoked refresh token, for example after a password change on another device or an Admin SDK revokeRefreshTokens() call. On the next cold start after the cached ID token has expired, the first token refresh fails and the native SDK signs the user out (on Apple it logs [FirebaseAuth][I-AUT000016] Invalid user token detected, user is automatically signed out.). In our app that happened 1 to 5 seconds after launch, which can be before the first authStateChanges() subscription exists.
The Apple and Android stream handlers drop the first native listener callback unconditionally, because Dart already has an initial value (APP_CURRENT_USER from the plugin constants). You can see it in FLTAuthStateChannelStreamHandler.swift and FLTIdTokenChannelStreamHandler.swift (iOS and macOS) and in AuthStateChannelStreamHandler.kt / IdTokenChannelStreamHandler.kt (Android), where initialAuthState makes the first callback return early. If the native user is already nil when the listener is registered, that first callback is the sign-out, and it gets dropped. On Apple no second nil follows, because addStateDidChangeListener only forwards uid changes. Calling signOut() from Dart afterwards doesn't fix it: the native SDK is already signed out, returns early, and sends no event.
This also breaks signing back in. After the user signs out manually and signs in again with the same account, Dart still holds that user, so apps that react to a change of user see nothing new, and navigation after sign-in can stall until the app is restarted.
Windows (firebase_auth_plugin.cpp) and web forward every callback and aren't affected.
Proposed fix: keep dropping the first callback when it carries a user, and forward it when the user is nil. On its own that would give a fresh signed-out app a second null event, which is what the "fires once on first initialization" test guards against (#3628), so the Dart handlers should also skip a null event when currentUser is already null. A normal signed-in launch behaves as before. I'll open a PR with both changes.
Reproducing the issue
- Sign in with email/password on macOS, iOS or Android, then quit the app.
- Revoke the user's refresh tokens (Admin SDK
revokeRefreshTokens(uid), or change the password from another client). - Wait at least an hour so the cached ID token expires.
- Launch the app and subscribe to
FirebaseAuth.instance.authStateChanges()a few seconds after startup, or after any early call that refreshes the token, such ascurrentUser!.getIdTokenResult()or a Firestore read. - Expected: the stream emits
nullandcurrentUserisnull. Actual: the stream emits the old user,currentUserstays non-null, token-dependent calls fail, and the native log shows the automatic sign-out.
We reproduced this on macOS with firebase_auth 6.7.0. With the proposed change, the app gets null and routes to sign-in, and signing in again works without a restart.
Firebase Core version: 4.15.0 (firebase_auth 6.7.0, firebase-ios-sdk 12.19.0, Android firebase-auth 24.2.0)
Flutter Version: 3.44.8 stable
Relevant Log Output
[FirebaseAuth][I-AUT000016] Invalid user token detected, user is automatically signed out.
[FirebaseFirestore][I-FST000001] Listen for query at users/<uid> failed: Missing or insufficient permissions.
FirebaseAuthException: [firebase_auth/no-current-user] No user currently signed in.
- Ngôn ngữ chính
- Dart
- Star
- 9.3k
- Fork
- 4.1k
- Merge trung bình
- 2 ngày 8 giờ
- Pull request đã merge (30 ngày)
- 46
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của firebase/flutterfire
-
blocked: customer-response Needs Attention platform: ios plugin: messaging type: bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
firebase/flutterfire#18776 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[📚] Remote Config Windows Support still N/A on ReadmeCó thể đã có người làm @nightcityblade đã nhận 8 ngày trước. Đang mởblocked: customer-response good first issue Needs Attention platform: windows plugin: remote_config type: documentation
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 30/100
firebase/flutterfire#18763 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[cloud_firestore]: a snapshots() listener cancelled while it registers is never removed nativelyCó thể đã có người làm @chiliec đã nhận 20 ngày trước. Đang mởNeeds Attention platform: android platform: ios platform: macos plugin: cloud_firestore reproduced type: bug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 72/100
firebase/flutterfire#18724 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[firebase_storage] Windows native crash in upload progress callback, sink ownership and thread dispatchCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởblocked: flutter platform: windows plugin: storage reproduced type: bug
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
firebase/flutterfire#18664 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[core] Decouple platform_interface from Flutter for pure-Dart webCó thể đã có người làm @Lyokone đã nhận 28 ngày trước. Đang mởNeeds Attention platform: all platform: web plugin: core type: enhancement
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
firebase/flutterfire#18645 · 3 bình luận · 2 reaction · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của firebase/flutterfire
Issue tương tự
-
Document supported hardwareĐang mởDocumentation
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Kazakh (kk_KZ) and Georgian (ka_GE) system locales get English instead of the shipped translationsĐang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Maintainer thường phản hồi trong vòng 1 ngày
-
area: docs eco: dart good first issue help wanted lane: free-agent roadmap size: XS type: docs
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
arminazimi/evergreen#430 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
area: rust-core bug priority: low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
bug direct-code
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
aaronified/fluenough#526 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày