refactor(admin): remove hardcoded email and dynamically resolve admin privileges via Firestore Admins collection
Build Android APK / Build Release APKs (push) Successful in 16m46s

This commit is contained in:
2026-09-14 11:44:04 +02:00
parent 2f2170573d
commit fb91666402
3 changed files with 65 additions and 15 deletions
+56 -12
View File
@@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AuthService extends ChangeNotifier {
@@ -47,21 +48,64 @@ class AuthService extends ChangeNotifier {
_initAuth();
}
static const List<String> adminEmails = [
'nicolas@gruber.info',
];
Future<void> _checkAdminClaim(User? user) async {
if (user != null && !user.isAnonymous) {
final email = user.email?.trim().toLowerCase();
if (email != null && adminEmails.contains(email)) {
_isAdmin = true;
return;
}
try {
// 1. Custom claims check (token.admin == true)
final tokenResult = await user.getIdTokenResult();
_isAdmin = tokenResult.claims?['admin'] == true;
} catch (_) {
if (tokenResult.claims?['admin'] == true) {
_isAdmin = true;
return;
}
final firestore = FirebaseFirestore.instance;
// 2. Check Firestore 'Admins' collection by user UID (doc id)
final docByUid =
await firestore.collection('Admins').doc(user.uid).get();
if (docByUid.exists) {
_isAdmin = true;
return;
}
// 3. Check Firestore 'Admins' collection by email (doc id)
final userEmail = user.email?.trim().toLowerCase();
if (userEmail != null && userEmail.isNotEmpty) {
final docByEmail =
await firestore.collection('Admins').doc(userEmail).get();
if (docByEmail.exists) {
_isAdmin = true;
return;
}
// 4. Check Firestore 'Admins' collection where email field == userEmail
final queryByEmail = await firestore
.collection('Admins')
.where('email', isEqualTo: userEmail)
.limit(1)
.get();
if (queryByEmail.docs.isNotEmpty) {
_isAdmin = true;
return;
}
}
// 5. Check Firestore 'Admins' collection where uid field == user.uid
final queryByUid = await firestore
.collection('Admins')
.where('uid', isEqualTo: user.uid)
.limit(1)
.get();
if (queryByUid.docs.isNotEmpty) {
_isAdmin = true;
return;
}
_isAdmin = false;
} catch (e) {
if (kDebugMode) {
debugPrint('Error checking admin status: $e');
}
_isAdmin = false;
}
} else {