authenticate method

  1. @override
Future<AuthenticatedUser?> authenticate(
  1. 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));
}