create static method

JWT create(
  1. Map<String, dynamic> payload, {
  2. String? secret,
  3. Duration? expiresIn,
})

Create a JWT token

Implementation

static JWT create(Map<String, dynamic> payload, {String? secret, Duration? expiresIn}) {
  final now = DateTime.now();
  final headerMap = {
    'alg': 'HS256',
    'typ': 'JWT',
  };

  // Create a copy of the payload to avoid mutation
  final payloadCopy = Map<String, dynamic>.from(payload);

  // Add issued at
  if (payloadCopy['iat'] == null) {
    payloadCopy['iat'] = (now.millisecondsSinceEpoch / 1000).round();
  }

  // Add expiration
  if (expiresIn != null) {
    payloadCopy['exp'] = (now.add(expiresIn).millisecondsSinceEpoch / 1000).round();
  }

  final headerBase64 = _base64Encode(jsonEncode(headerMap));
  final payloadBase64 = _base64Encode(jsonEncode(payloadCopy));
  final signingInput = '$headerBase64.$payloadBase64';

  String? signature;
  if (secret != null) {
    final key = utf8.encode(secret);
    final bytes = utf8.encode(signingInput);
    final hmac = Hmac(sha256, key);
    final digest = hmac.convert(bytes);
    signature = _base64UrlEncode(digest.bytes);
  }

  final token = '$signingInput.${signature ?? ''}';
  return JWT(
    token: token,
    payload: payloadCopy,
    signature: signature,
    issuedAt: now,
    expiresAt: payloadCopy['exp'] != null ? DateTime.fromMillisecondsSinceEpoch(payloadCopy['exp'] * 1000) : null,
  );
}