Skip to main content

Auth

ArchbaseAuthService<U extends ArchbaseUser> é a classe abstrata de autenticação. Você implementa só dois métodos — o resto (persistência de token, refresh coordenado, logout, currentUser stream) está pronto.

Implementação mínima

class MeuAuthService extends ArchbaseAuthService<SimpleArchbaseUser> {
MeuAuthService({required super.apiClient, required super.tokens});


Future<ArchbaseAuthResult<SimpleArchbaseUser>> performLogin({
required String username,
required String password,
}) async {
final response = await apiClient.postJson<Map<String, dynamic>>(
'/auth/login',
{'username': username, 'password': password},
(json) => json,
);
final data = response.orThrow();
return ArchbaseAuthResult(
user: SimpleArchbaseUser(
id: data['userId'] as String,
email: data['email'] as String,
displayName: data['name'] as String,
),
accessToken: data['accessToken'] as String,
refreshToken: data['refreshToken'] as String,
);
}


Future<ArchbaseAuthResult<SimpleArchbaseUser>> performRefresh(
String refreshToken,
) async {
final response = await apiClient.postJson<Map<String, dynamic>>(
'/auth/refresh',
{'refreshToken': refreshToken},
(json) => json,
);
final data = response.orThrow();
return ArchbaseAuthResult(
user: currentUser.value!,
accessToken: data['accessToken'] as String,
refreshToken: data['refreshToken'] as String,
);
}
}

User customizado

Se o seu app precisa de campos além de email + displayName, crie sua própria classe:

class MeuUser implements ArchbaseUser {
MeuUser({
required this.id,
required this.email,
required this.displayName,
required this.tenantId,
required this.roles,
});


final String id;

final String email;

final String displayName;
final String tenantId;
final List<String> roles;
}

class MeuAuthService extends ArchbaseAuthService<MeuUser> { ... }

API pública

Após init:

final auth = ArchbaseBootstrap.auth; // já tipado como seu Service

// Estado reativo
auth.currentUser.addListener(() {
final user = auth.currentUser.value;
print(user == null ? 'deslogado' : 'logado como ${user.displayName}');
});

// Ações
await auth.login(username: 'edson', password: '...');
await auth.logout();

// Biometria (opcional)
if (await auth.isBiometricAvailable()) {
await auth.loginWithBiometric();
}

ArchbaseTokenHolder

Persiste tokens em secure_storage. Você passa para o AuthService no bootstrap:

final auth = MeuAuthService(
apiClient: ArchbaseBootstrap.api,
tokens: ArchbaseTokenHolder(ArchbaseBootstrap.storage),
);

Inclui accessToken, refreshToken, timestamp de expiração. Os interceptors de API leem direto desse holder.