Authentification
Introduction
Nylo Website v7 fournit un systeme d'authentification complet via la classe Auth. Il gere le stockage securise des identifiants utilisateur, la gestion des sessions et prend en charge plusieurs sessions nommees pour differents contextes d'authentification.
Les donnees d'authentification sont stockees de maniere securisee et synchronisees avec Backpack (un magasin cle-valeur en memoire) pour un acces synchrone rapide dans toute votre application.
import 'package:nylo_framework/nylo_framework.dart';
// Authenticate a user
await Auth.authenticate(data: {"token": "abc123", "userId": 1});
// Check if authenticated
bool loggedIn = await Auth.isAuthenticated(); // true
// Get auth data
dynamic token = Auth.data(field: 'token'); // "abc123"
// Logout
await Auth.logout();
Authentifier les utilisateurs
Utilisez Auth.authenticate() pour stocker les donnees de session utilisateur :
// With a Map
await Auth.authenticate(data: {
"token": "ey2sdm...",
"userId": 123,
"email": "user@example.com",
});
// With a Model class
User user = User(id: 123, email: "user@example.com", token: "ey2sdm...");
await Auth.authenticate(data: user);
// Without data (stores a timestamp)
await Auth.authenticate();
Exemple concret
class _LoginPageState extends NyPage<LoginPage> {
Future<void> handleLogin(String email, String password) async {
// 1. Call your API to authenticate
User? user = await api<AuthApiService>((request) => request.login(
email: email,
password: password,
));
if (user == null) {
showToastDanger(description: "Invalid credentials");
return;
}
// 2. Store the authenticated user
await Auth.authenticate(data: user);
// 3. Navigate to home
routeTo(HomePage.path, removeUntil: (_) => false);
}
}
Recuperer les donnees d'authentification
Recuperez les donnees d'authentification stockees avec Auth.data() :
// Get all auth data
dynamic userData = Auth.data();
print(userData); // {"token": "ey2sdm...", "userId": 123}
// Get a specific field
String? token = Auth.data(field: 'token');
int? userId = Auth.data(field: 'userId');
La methode Auth.data() lit depuis Backpack (le magasin cle-valeur en memoire de Nylo Website) pour un acces synchrone rapide. Les donnees sont automatiquement synchronisees avec Backpack lors de l'authentification.
Mettre a jour les donnees d'authentification
Nylo Website v7 introduit Auth.set() pour mettre a jour les donnees d'authentification :
// Update a specific field
await Auth.set((data) {
data['token'] = 'new_token_value';
return data;
});
// Add new fields
await Auth.set((data) {
data['refreshToken'] = 'refresh_abc123';
data['lastLogin'] = DateTime.now().toIso8601String();
return data;
});
// Replace entire data
await Auth.set((data) => {
'token': newToken,
'userId': userId,
});
Deconnexion
Supprimez l'utilisateur authentifie avec Auth.logout() :
Future<void> handleLogout() async {
await Auth.logout();
// Navigate to login page
routeTo(LoginPage.path, removeUntil: (_) => false);
}
Deconnexion de toutes les sessions
Lorsque vous utilisez plusieurs sessions, effacez-les toutes :
// Logout from default and all named sessions
await Auth.logoutAll(sessions: ['device', 'admin']);
Verifier l'authentification
Verifiez si un utilisateur est actuellement authentifie :
bool isLoggedIn = await Auth.isAuthenticated();
if (isLoggedIn) {
// User is authenticated
routeTo(HomePage.path);
} else {
// User needs to login
routeTo(LoginPage.path);
}
Sessions multiples
Nylo Website v7 prend en charge plusieurs sessions d'authentification nommees pour differents contextes. Ceci est utile lorsque vous devez suivre differents types d'authentification separement (par ex., connexion utilisateur vs enregistrement d'appareil vs acces administrateur).
// Default user session
await Auth.authenticate(data: user);
// Device authentication session
await Auth.authenticate(
data: {"deviceToken": "abc123"},
session: 'device',
);
// Admin session
await Auth.authenticate(
data: adminUser,
session: 'admin',
);
Lecture depuis les sessions nommees
// Default session
dynamic userData = Auth.data();
String? userToken = Auth.data(field: 'token');
// Device session
dynamic deviceData = Auth.data(session: 'device');
String? deviceToken = Auth.data(field: 'deviceToken', session: 'device');
// Admin session
dynamic adminData = Auth.data(session: 'admin');
Deconnexion specifique a une session
// Logout from default session only
await Auth.logout();
// Logout from device session only
await Auth.logout(session: 'device');
// Logout from all sessions
await Auth.logoutAll(sessions: ['device', 'admin']);
Verifier l'authentification par session
bool userLoggedIn = await Auth.isAuthenticated();
bool deviceRegistered = await Auth.isAuthenticated(session: 'device');
bool isAdmin = await Auth.isAuthenticated(session: 'admin');
Identifiant d'appareil
Nylo Website v7 fournit un identifiant d'appareil unique qui persiste entre les sessions de l'application :
String deviceId = await Auth.deviceId();
// Example: "550e8400-e29b-41d4-a716-446655440000-1704067200000"
L'identifiant d'appareil est :
- Genere une seule fois et stocke de maniere permanente
- Unique a chaque appareil/installation
- Utile pour l'enregistrement d'appareils, l'analytique ou les notifications push
// Example: Register device with backend
Future<void> registerDevice() async {
String deviceId = await Auth.deviceId();
String? pushToken = await FirebaseMessaging.instance.getToken();
await api<DeviceApiService>((request) => request.register(
deviceId: deviceId,
pushToken: pushToken,
));
// Store device auth
await Auth.authenticate(
data: {"deviceId": deviceId, "pushToken": pushToken},
session: 'device',
);
}
Synchronisation avec Backpack
Les donnees d'authentification sont automatiquement synchronisees avec Backpack lors de l'authentification. Pour synchroniser manuellement (par exemple, au demarrage de l'application) :
// Sync default session
await Auth.syncToBackpack();
// Sync specific session
await Auth.syncToBackpack(session: 'device');
// Sync all sessions
await Auth.syncAllToBackpack(sessions: ['device', 'admin']);
Ceci est utile dans la sequence de demarrage de votre application pour garantir que les donnees d'authentification sont disponibles dans Backpack pour un acces synchrone rapide.
Route initiale
La route initiale est la premiere page que les utilisateurs voient lorsqu'ils ouvrent votre application. Definissez-la avec .initialRoute() dans votre routeur :
// routes/router.dart
appRouter() => nyRoutes((router) {
router.add(LoginPage.path).initialRoute();
router.add(HomePage.path);
});
Vous pouvez egalement definir une route initiale conditionnelle avec le parametre when :
appRouter() => nyRoutes((router) {
router.add(OnboardingPage.path).initialRoute(
when: () => !hasCompletedOnboarding()
);
router.add(HomePage.path).initialRoute(
when: () => hasCompletedOnboarding()
);
});
Naviguez vers la route initiale depuis n'importe ou avec routeToInitial() :
void _goHome() {
routeToInitial();
}
Route authentifiee
La route authentifiee remplace la route initiale lorsqu'un utilisateur est connecte. Definissez-la avec .authenticatedRoute() :
appRouter() => nyRoutes((router) {
router.add(LoginPage.path).initialRoute();
router.add(HomePage.path).authenticatedRoute();
router.add(ProfilePage.path);
router.add(SettingsPage.path);
});
Au demarrage de l'application :
Auth.isAuthenticated()retournetrue→ l'utilisateur voit la route authentifiee (HomePage)Auth.isAuthenticated()retournefalse→ l'utilisateur voit la route initiale (LoginPage)
Vous pouvez egalement definir une route authentifiee conditionnelle :
router.add(HomePage.path).authenticatedRoute(
when: () => hasCompletedSetup()
);
Naviguez vers la route authentifiee par programmation avec routeToAuthenticatedRoute() :
// After login
await Auth.authenticate(data: user);
routeToAuthenticatedRoute();
Voir aussi : Router pour la documentation complete du routage, y compris les guards et le deep linking.
Route de previsualisation
Pendant le developpement, vous pouvez vouloir previsualiser rapidement une page specifique sans changer votre route initiale ou authentifiee. Utilisez .previewRoute() :
appRouter() => nyRoutes((router) {
router.add(LoginPage.path).initialRoute();
router.add(HomePage.path).authenticatedRoute();
router.add(SettingsPage.path).previewRoute(); // Opens first during development
});
previewRoute() remplace a la fois initialRoute() et authenticatedRoute(), faisant de la route specifiee la premiere page affichee quel que soit l'etat d'authentification.
Avertissement : Supprimez
.previewRoute()avant de publier votre application.
Route inconnue
Definissez une page de secours lorsqu'un utilisateur navigue vers une route qui n'existe pas. Definissez-la avec .unknownRoute() :
appRouter() => nyRoutes((router) {
router.add(HomePage.path).initialRoute();
router.add(NotFoundPage.path).unknownRoute();
});
Vue d'ensemble
Voici une configuration de routeur complete avec tous les types de routes :
appRouter() => nyRoutes((router) {
// First page for unauthenticated users
router.add(LoginPage.path).initialRoute();
// First page for authenticated users
router.add(HomePage.path).authenticatedRoute();
// 404 page
router.add(NotFoundPage.path).unknownRoute();
// Regular routes
router.add(ProfilePage.path);
router.add(SettingsPage.path);
});
| Methode de route | Objectif |
|---|---|
.initialRoute() |
Premiere page affichee aux utilisateurs non authentifies |
.authenticatedRoute() |
Premiere page affichee aux utilisateurs authentifies |
.previewRoute() |
Remplace les deux pendant le developpement |
.unknownRoute() |
Affichee lorsqu'une route n'est pas trouvee |
Fonctions d'aide
Nylo Website v7 fournit des fonctions d'aide qui reproduisent les methodes de la classe Auth :
| Fonction d'aide | Equivalent |
|---|---|
authAuthenticate(data: user) |
Auth.authenticate(data: user) |
authData() |
Auth.data() |
authData(field: 'token') |
Auth.data(field: 'token') |
authSet((data) => {...}) |
Auth.set((data) => {...}) |
authIsAuthenticated() |
Auth.isAuthenticated() |
authLogout() |
Auth.logout() |
authLogoutAll(sessions: [...]) |
Auth.logoutAll(sessions: [...]) |
authSyncToBackpack() |
Auth.syncToBackpack() |
authKey() |
Cle de stockage pour la session par defaut |
authDeviceId() |
Auth.deviceId() |
Tous les helpers acceptent les memes parametres que leurs equivalents de la classe Auth, y compris le parametre optionnel session :
// Authenticate with a named session
await authAuthenticate(data: device, session: 'device');
// Read from a named session
dynamic deviceData = authData(session: 'device');
// Check a named session
bool deviceAuth = await authIsAuthenticated(session: 'device');