feat: enhance JWT authentication handling with new fields and JWT generation utility

This commit is contained in:
Udhay-Adithya
2025-06-13 14:47:51 +05:30
parent 1540d84de5
commit 52a1feb0ee
7 changed files with 657 additions and 74 deletions

View File

@@ -0,0 +1,95 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:apidash_core/models/auth/auth_jwt_model.dart';
import 'package:crypto/crypto.dart';
String generateJWT(AuthJwtModel jwtAuth) {
try {
Map<String, dynamic> header;
if (jwtAuth.header.isNotEmpty) {
try {
header = json.decode(jwtAuth.header) as Map<String, dynamic>;
} catch (e) {
header = {};
}
} else {
header = {};
}
header['typ'] = header['typ'] ?? 'JWT';
header['alg'] = jwtAuth.algorithm;
Map<String, dynamic> payload;
if (jwtAuth.payload.isNotEmpty) {
try {
payload = json.decode(jwtAuth.payload) as Map<String, dynamic>;
} catch (e) {
payload = {};
}
} else {
payload = {};
}
if (!payload.containsKey('iat')) {
payload['iat'] = DateTime.now().millisecondsSinceEpoch ~/ 1000;
}
// Encode header and payload
final encodedHeader = _base64UrlEncode(utf8.encode(json.encode(header)));
final encodedPayload = _base64UrlEncode(utf8.encode(json.encode(payload)));
// Create signature
final signature = _createSignature(
'$encodedHeader.$encodedPayload',
jwtAuth.secret,
jwtAuth.algorithm,
jwtAuth.isSecretBase64Encoded,
);
return '$encodedHeader.$encodedPayload.$signature';
} catch (e) {
// Return a basic JWT if generation fails
return 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
}
}
String _createSignature(
String data, String secret, String algorithm, bool isSecretBase64Encoded) {
try {
Uint8List secretBytes;
if (isSecretBase64Encoded) {
secretBytes = base64.decode(secret);
} else {
secretBytes = utf8.encode(secret);
}
final dataBytes = utf8.encode(data);
switch (algorithm) {
case 'HS256':
final hmac = Hmac(sha256, secretBytes);
final digest = hmac.convert(dataBytes);
return _base64UrlEncode(digest.bytes);
case 'HS384':
final hmac = Hmac(sha384, secretBytes);
final digest = hmac.convert(dataBytes);
return _base64UrlEncode(digest.bytes);
case 'HS512':
final hmac = Hmac(sha512, secretBytes);
final digest = hmac.convert(dataBytes);
return _base64UrlEncode(digest.bytes);
default:
// Default to HS256
final hmac = Hmac(sha256, secretBytes);
final digest = hmac.convert(dataBytes);
return _base64UrlEncode(digest.bytes);
}
} catch (e) {
// Return placeholder signature if creation fails
return _base64UrlEncode(utf8.encode('signature_generation_failed'));
}
}
String _base64UrlEncode(List<int> bytes) {
return base64Url.encode(bytes).replaceAll('=', '');
}

View File

@@ -2,9 +2,11 @@ import 'dart:convert';
import 'package:apidash_core/consts.dart';
import 'package:apidash_core/models/auth/api_auth_model.dart';
import 'package:apidash_core/models/http_request_model.dart';
import 'package:apidash_core/utils/auth_utils.dart';
import 'package:seed/seed.dart';
HttpRequestModel handleAuth(HttpRequestModel httpRequestModel, ApiAuthModel? auth) {
HttpRequestModel handleAuth(
HttpRequestModel httpRequestModel, ApiAuthModel? auth) {
if (auth == null || auth.type == APIAuthType.none) {
return httpRequestModel;
}
@@ -41,9 +43,26 @@ HttpRequestModel handleAuth(HttpRequestModel httpRequestModel, ApiAuthModel? aut
case APIAuthType.jwt:
if (auth.jwt != null) {
final jwtAuth = auth.jwt!;
updatedHeaders.add(NameValueModel(
name: 'Authorization', value: 'Bearer ${jwtAuth.jwt}'));
updatedHeaderEnabledList.add(true);
// Generate JWT token
final jwtToken = generateJWT(jwtAuth);
if (jwtAuth.addTokenTo == 'header') {
// Add to request header with prefix
final headerValue = jwtAuth.headerPrefix.isNotEmpty
? '${jwtAuth.headerPrefix} $jwtToken'
: jwtToken;
updatedHeaders
.add(NameValueModel(name: 'Authorization', value: headerValue));
updatedHeaderEnabledList.add(true);
} else if (jwtAuth.addTokenTo == 'query') {
// Add to query parameters(if selected)
final paramKey = jwtAuth.queryParamKey.isNotEmpty
? jwtAuth.queryParamKey
: 'token';
updatedParams.add(NameValueModel(name: paramKey, value: jwtToken));
updatedParamEnabledList.add(true);
}
}
break;