sign method

String sign(
  1. JWTKey key, {
  2. JWTAlgorithm algorithm = JWTAlgorithm.hs256,
  3. Duration? expiresIn,
  4. Duration? notBefore,
  5. bool noIssueAt = false,
})

Sign and generate a new token with key. Key must be SecretKey with HMAC algorithm

Implementation

String sign(
  JWTKey key, {
  JWTAlgorithm algorithm = JWTAlgorithm.hs256,
  Duration? expiresIn,
  Duration? notBefore,
  bool noIssueAt = false,
}) {
  try {
    header ??= {};
    header!.addAll({'alg': algorithm.name, 'typ': 'JWT'});

    if (payload is Map<String, dynamic> || payload is Map<dynamic, dynamic>) {
      try {
        payload = Map<String, dynamic>.from(payload);
        if (!noIssueAt) payload['iat'] = secondsSinceEpoch(DateTime.now());
        if (expiresIn != null) payload['exp'] = secondsSinceEpoch(DateTime.now().add(expiresIn));
        if (notBefore != null) payload['nbf'] = secondsSinceEpoch(DateTime.now().add(notBefore));
        if (subject != null) payload['sub'] = subject;
        if (issuer != null) payload['iss'] = issuer;
        if (jwtId != null) payload['jti'] = jwtId;
      } catch (ex) {
        assert(
          payload is Map<String, dynamic>,
          'If payload is a Map its must be a Map<String, dynamic>',
        );
      }
    }

    final b64Header = base64Unpadded(jsonBase64.encode(header));

    String b64Payload;
    try {
      b64Payload = base64Unpadded(
        payload is String
            ? base64.encode(utf8.encode(payload))
            : jsonBase64.encode(payload),
      );
    } catch (ex) {
      throw JWTError(
        'invalid payload json format (Map keys must be String type)',
      );
    }

    final body = '$b64Header.$b64Payload';
    final signature = base64Unpadded(
      base64Url.encode(
        algorithm.sign(
          key,
          Uint8List.fromList(utf8.encode(body)),
        ),
      ),
    );

    return '$body.$signature';
  } catch (ex) {
    if (ex is Error && ex is! JWTError) {
      throw JWTUndefinedError(ex);
    } else {
      rethrow;
    }
  }
}