didvan-app/lib/services/auth/jwt_utils.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);
}
}