Basics

Kimlik Dogrulama

Giris

Nylo Website v7, Auth sinifi araciligiyla kapsamli bir kimlik dogrulama sistemi sunar. Kullanici kimlik bilgilerinin guvenli depolanmasini, oturum yonetimini ve farkli kimlik dogrulama baglamlari icin birden fazla adlandirilmis oturumu destekler.

Kimlik dogrulama verileri guvenli bir sekilde saklanir ve hizli, senkron erisim icin Backpack'e (bellek ici anahtar-deger deposu) senkronize edilir.

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();

Kullanici Kimlik Dogrulamasi

Kullanici oturum verilerini saklamak icin Auth.authenticate() kullanin:

// 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();

Gercek Dunya Ornegi

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);
  }
}

Kimlik Dogrulama Verilerini Alma

Saklanan kimlik dogrulama verilerini Auth.data() kullanarak alin:

// 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');

Auth.data() metodu hizli senkron erisim icin Backpack'ten (Nylo Website'in bellek ici anahtar-deger deposu) okur. Kimlik dogrulamasi yaptiginizda veriler otomatik olarak Backpack'e senkronize edilir.

Kimlik Dogrulama Verilerini Guncelleme

Nylo Website v7, kimlik dogrulama verilerini guncellemek icin Auth.set() sunar:

// 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,
});

Cikis Yapma

Kimlik dogrulanmis kullaniciyi Auth.logout() ile kaldirin:

Future<void> handleLogout() async {
  await Auth.logout();

  // Navigate to login page
  routeTo(LoginPage.path, removeUntil: (_) => false);
}

Tum Oturumlardan Cikis

Coklu oturum kullanirken, hepsini temizleyin:

// Logout from default and all named sessions
await Auth.logoutAll(sessions: ['device', 'admin']);

Kimlik Dogrulama Kontrolu

Kullanicinin su anda kimlik dogrulanmis olup olmadigini kontrol edin:

bool isLoggedIn = await Auth.isAuthenticated();

if (isLoggedIn) {
  // User is authenticated
  routeTo(HomePage.path);
} else {
  // User needs to login
  routeTo(LoginPage.path);
}

Coklu Oturum

Nylo Website v7, farkli baglamlar icin birden fazla adlandirilmis kimlik dogrulama oturumu destekler. Bu, farkli kimlik dogrulama turlerini ayri ayri takip etmeniz gerektiginde kullanislidir (orn., kullanici girisi vs cihaz kaydı vs yonetici erisimi).

// 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',
);

Adlandirilmis Oturumlardan Okuma

// 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');

Oturuma Ozel Cikis

// 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']);

Oturum Basina Kimlik Dogrulama Kontrolu

bool userLoggedIn = await Auth.isAuthenticated();
bool deviceRegistered = await Auth.isAuthenticated(session: 'device');
bool isAdmin = await Auth.isAuthenticated(session: 'admin');

Cihaz Kimligi

Nylo Website v7, uygulama oturumlari arasinda kalici olan benzersiz bir cihaz tanimlayicisi saglar:

String deviceId = await Auth.deviceId();
// Example: "550e8400-e29b-41d4-a716-446655440000-1704067200000"

Cihaz kimligi:

  • Bir kez olusturulur ve kalici olarak saklanir
  • Her cihaz/kurulum icin benzersizdir
  • Cihaz kaydi, analitik veya push bildirimleri icin kullanislidir
// 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',
  );
}

Backpack'e Senkronizasyon

Kimlik dogrulama verileri, kimlik dogrulamasi yaptiginizda otomatik olarak Backpack'e senkronize edilir. Manuel senkronizasyon icin (orn., uygulama baslangicindan):

// Sync default session
await Auth.syncToBackpack();

// Sync specific session
await Auth.syncToBackpack(session: 'device');

// Sync all sessions
await Auth.syncAllToBackpack(sessions: ['device', 'admin']);

Bu, hizli senkron erisim icin kimlik dogrulama verilerinin Backpack'te mevcut olmasini saglamak adina uygulamanizin baslatma surecinde kullanislidir.

Baslangic Rotasi

Baslangic rotasi, kullanicilarin uygulamanizi actiklarinda gordukleri ilk sayfadir. Router'inizda .initialRoute() kullanarak ayarlayin:

// routes/router.dart
appRouter() => nyRoutes((router) {
  router.add(LoginPage.path).initialRoute();

  router.add(HomePage.path);
});

when parametresini kullanarak kosullu bir baslangic rotasi da ayarlayabilirsiniz:

appRouter() => nyRoutes((router) {
  router.add(OnboardingPage.path).initialRoute(
    when: () => !hasCompletedOnboarding()
  );

  router.add(HomePage.path).initialRoute(
    when: () => hasCompletedOnboarding()
  );
});

Herhangi bir yerden baslangic rotasina routeToInitial() kullanarak donebilirsiniz:

void _goHome() {
  routeToInitial();
}

Kimlik Dogrulanmis Rota

Kimlik dogrulanmis rota, kullanici giris yaptiginda baslangic rotasini gecersiz kilar. .authenticatedRoute() kullanarak ayarlayin:

appRouter() => nyRoutes((router) {
  router.add(LoginPage.path).initialRoute();

  router.add(HomePage.path).authenticatedRoute();

  router.add(ProfilePage.path);
  router.add(SettingsPage.path);
});

Uygulama basladiginda:

  • Auth.isAuthenticated() true dondururse → kullanici kimlik dogrulanmis rotayi (HomePage) gorur
  • Auth.isAuthenticated() false dondururse → kullanici baslangic rotasini (LoginPage) gorur

Kosullu bir kimlik dogrulanmis rota da ayarlayabilirsiniz:

router.add(HomePage.path).authenticatedRoute(
  when: () => hasCompletedSetup()
);

routeToAuthenticatedRoute() kullanarak kimlik dogrulanmis rotaya programatik olarak gidin:

// After login
await Auth.authenticate(data: user);
routeToAuthenticatedRoute();

Ayrica bakiniz: Guard'lar ve deep linking dahil tam yonlendirme dokumantasyonu icin Router.

Onizleme Rotasi

Gelistirme sirasinda, baslangic veya kimlik dogrulanmis rotanizi degistirmeden belirli bir sayfayi hizlica onizlemek isteyebilirsiniz. .previewRoute() kullanin:

appRouter() => nyRoutes((router) {
  router.add(LoginPage.path).initialRoute();

  router.add(HomePage.path).authenticatedRoute();

  router.add(SettingsPage.path).previewRoute(); // Opens first during development
});

previewRoute(), kimlik dogrulama durumundan bagimsiz olarak belirtilen rotayi ilk gosterilen sayfa yaparak hem initialRoute() hem de authenticatedRoute() gecersiz kilar.

Uyari: Uygulamanizi yayinlamadan once .previewRoute() kaldirin.

Bilinmeyen Rota

Kullanici mevcut olmayan bir rotaya gittiginde gosterilecek bir yedek sayfa tanimlayin. .unknownRoute() kullanarak ayarlayin:

appRouter() => nyRoutes((router) {
  router.add(HomePage.path).initialRoute();

  router.add(NotFoundPage.path).unknownRoute();
});

Hepsini Bir Araya Getirme

Iste tum rota turlerini iceren eksiksiz bir router kurulumu:

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);
});
Rota Metodu Amac
.initialRoute() Kimligi dogrulanmamis kullanicilara gosterilen ilk sayfa
.authenticatedRoute() Kimligi dogrulanmis kullanicilara gosterilen ilk sayfa
.previewRoute() Gelistirme sirasinda her ikisini gecersiz kilar
.unknownRoute() Rota bulunamadiginda gosterilir

Yardimci Fonksiyonlar

Nylo Website v7, Auth sinifi metotlarini yansitan yardimci fonksiyonlar saglar:

Yardimci Fonksiyon Karsiligi
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() Varsayilan oturum icin depolama anahtari
authDeviceId() Auth.deviceId()

Tum yardimcilar, istege bagli session parametresi dahil olmak uzere Auth sinifi karsiliklariyla ayni parametreleri kabul eder:

// 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');