validateToken method

Result<Principal> validateToken(
  1. String accessToken
)

Implementation

Result<Principal> validateToken(String accessToken) {
  JWT decoded;
  try {
    decoded = JWT.verify(
      accessToken,
      publicVerifyKey,
    );
  } on JWTExpiredException {
    return Result.error("Token has expired");
  } on JWTException catch (e) {
    // invalid signature / malformed token / etc
    print("JWT verification error: $e");
    return Result.error("Invalid token");
  } catch (e) {
    print("Unexpected error during JWT verification: $e");
    return Result.error("Invalid token");
  }

  // Extract claims
  final payload = decoded.payload; // Map<String, dynamic>
  final issuedFor = payload["issued_for"]?.toString().trim();
  if (issuedFor == null || issuedFor.isEmpty) {
    return Result.error("Invalid token: missing issuedFor claim");
  }
  final permission = int.tryParse(payload["permission"]?.toString() ?? "");
  if (permission == null) {
    return Result.error(
        "Invalid token: missing permission claim or not an integer (single digit POSIX permission)");
  }

  final principal = Principal._fromNumberPermission(issuedFor, permission);
  return Result.value(principal);
}