36 lines
1.2 KiB
Dart
36 lines
1.2 KiB
Dart
// lib/services/auth/jwt_utils.dart
|
|
//
|
|
// ابزار کوچک برای decode کردن claims یک JWT بدون اعتبارسنجی signature.
|
|
// از این فقط برای استخراج اطلاعات داخل توکن استفاده میکنیم (مثلا sub).
|
|
|
|
import 'dart:convert';
|
|
|
|
class JwtUtils {
|
|
/// claims یک JWT را به صورت Map برمیگرداند، یا در صورت نامعتبر بودن null.
|
|
static Map<String, dynamic>? decodePayload(String token) {
|
|
try {
|
|
final parts = token.split('.');
|
|
if (parts.length < 2) return null;
|
|
final payload = _padBase64(parts[1]);
|
|
final decoded = utf8.decode(base64Url.decode(payload));
|
|
final map = json.decode(decoded);
|
|
if (map is Map<String, dynamic>) return map;
|
|
return Map<String, dynamic>.from(map as Map);
|
|
} catch (_) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// مقدار claim `sub` (شناسه کاربر در Keycloak) را برمیگرداند.
|
|
static String? subjectOf(String token) {
|
|
final payload = decodePayload(token);
|
|
return payload?['sub'] as String?;
|
|
}
|
|
|
|
static String _padBase64(String input) {
|
|
final mod = input.length % 4;
|
|
if (mod == 0) return input;
|
|
return input + '=' * (4 - mod);
|
|
}
|
|
}
|