Flutter Firebase Auth - Bắt mã thông báo hết hạn
Tôi đang sử dụng plugin Firebase Auth để xác thực ứng dụng Flutter của mình.
Cho đến khi nâng cấp (không chắc chắn nếu có liên quan) lên phiên bản xác thực Firebase mới nhất:
firebase_core: ^0.5.0
firebase_auth: ^0.18.0+1
mọi thứ đều hoạt động tốt.
Bây giờ, lần đầu tiên tôi gặp lỗi Sentry:
FirebaseAuthException: [firebase_auth/user-token-expired] The user's credential is no longer valid. The user must sign in again.
File "exception.dart", line 20, in catchPlatformException
File "zone.dart", line 1198, in _rootRunUnary
File "zone.dart", line 1100, in _CustomZone.runUnary
File "future_impl.dart", line 160, in _FutureListener.handleError
File "future_impl.dart", line 708, in Future._propagateToListeners.handleError
File "future_impl.dart", line 729, in Future._propagateToListeners
File "future_impl.dart", line 537, in Future._completeError
File "async_patch.dart", line 47, in _AsyncAwaitCompleter.completeError
File "platform_channel.dart", in MethodChannel.invokeMapMethod
File "<asynchronous suspension>"
File "unparsed"
Làm thế nào điều này có thể xảy ra? Người dùng nói rằng anh ta đã không sử dụng ứng dụng này trong vài ngày. Như tôi hiểu tài liệu Xác thực Firebase, mã xác thực tự động được làm mới bằng mã làm mới.
Làm cách nào để giảm thiểu vấn đề này?
Tôi có thể bắt ngoại lệ này ở đâu / làm cách nào để chuyển hướng người dùng đến màn hình đăng nhập?
Trả lời
Bạn có thể làm một vài điều,
Đầu tiên :
khi người dùng khởi động ứng dụng của bạn, trước tiên bạn nên kiểm tra xem người dùng đã đăng nhập hay chưa, nếu có thì đăng nhập im lặng, nếu chưa thì gửi người dùng đăng nhập trang, dưới đây là ví dụ từ ứng dụng của tôi. xây dựng bốn tháng trước (bạn sẽ phải thêm phụ thuộc google_sign_in vào ứng dụng của mình)
class _StartingPageState extends State<StartingPage> {
Future<dynamic> decideStartingPage() async {
bool isUserSignedIn = await googleSignIn.isSignedIn();
if (isUserSignedIn == true) {
FirebaseUser futurefbuser =await getCurrentFirebaseUser();
assignFireBaseUser(futurefbuser);
await googleSignIn.signInSilently();
return HomeTabView();
}
else
return LoginPage();
}
Future<dynamic> startingpage;
@override
void initState(){
super.initState();
startingpage=decideStartingPage();
FirebaseAdMob.instance.initialize(appId: "ca-app-pub-...........");
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future:startingpage,
builder: (BuildContext ctx, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Center( child : const CircularProgressIndicator());
}
else
return snapshot.data;
}
);
}
}
Thứ hai:
Điều thứ hai bạn có thể làm là lưu mã thông báo truy cập và (hoặc) mã thông báo làm mới bạn nhận được khi người dùng đăng nhập, khi hết hạn, bạn có thể nhận được mã thông báo truy cập khác bằng cách sử dụng mã làm mới. Điều đó có nghĩa là bạn sẽ phải làm thêm một chút vì bạn sẽ phải lưu mã thông báo trong các tùy chọn được chia sẻ hoặc trong tệp json.
Bây giờ nơi để thêm mã xử lý quy trình trên? Bạn phải xác định điều đầu tiên mà chỉ người dùng đã được xác thực mới có thể làm như ghi vào cơ sở dữ liệu, rất có thể ứng dụng của bạn đang đưa ra ngoại lệ vì người dùng chưa được xác thực cho thao tác đó. Sử dụng try, catch và cuối cùng bạn có thể đăng nhập lại người dùng mà không cần người dùng làm bất cứ điều gì. để biết thêm thông tin hãy truy cập cái này
Trong trường hợp đầu tiên người dùng cần phải đăng nhập lại một cách rõ ràng, phương pháp thứ hai yêu cầu bạn thực hiện thêm công việc nhưng thuận tiện hơn cho người dùng. Sự lựa chọn là của bạn .