authenticate method
- AuthenticationRequest request
override
Implementation
@override
Future<AuthenticatedUser?> authenticate(AuthenticationRequest request) async {
final token = request.token;
if (token == null || token.isEmpty) return null;
final outgoing = await _client.postUrl(endpoint).timeout(timeout);
outgoing.headers.contentType = ContentType.json;
outgoing.headers.set(HttpHeaders.authorizationHeader, 'Bearer $token');
outgoing.write(
jsonEncode({
'token': token,
'requestUri': request.uri.toString(),
'remoteAddress': request.remoteAddress?.address,
}),
);
final response = await outgoing.close().timeout(timeout);
if (response.statusCode == HttpStatus.unauthorized ||
response.statusCode == HttpStatus.forbidden) {
await response.drain();
return null;
}
if (response.statusCode < 200 || response.statusCode >= 300) {
await response.drain();
throw AuthenticationSourceException(
'Authentication endpoint returned HTTP ${response.statusCode}',
);
}
final decoded = jsonDecode(await response.transform(utf8.decoder).join());
if (decoded is! Map) {
throw AuthenticationSourceException(
'Authentication endpoint returned an invalid response',
);
}
final id = decoded['userId'] ?? decoded['id'];
if (id is! String || id.isEmpty) return null;
return AuthenticatedUser(id: id, canCreateRooms: _readPermission(decoded));
}