"""ابزارهای امنیتی مشترک بین سرویس‌ها. شامل ساختار کاربر جاری، اسکوپ توکن‌های داخلی و توابع hash کردن توکن. منطق تولید/اعتبارسنجی JWT کاربر در هر سرویس (core.security) پیاده می‌شود. """ from __future__ import annotations import hashlib import hmac import secrets from dataclasses import dataclass, field def hash_token(token: str, *, secret: str) -> str: """تولید hash امن برای ذخیره توکن‌های داخلی سرویس. توکن خام هرگز در دیتابیس ذخیره نمی‌شود؛ فقط hash آن نگهداری می‌شود. """ return hmac.new(secret.encode("utf-8"), token.encode("utf-8"), hashlib.sha256).hexdigest() def verify_token(token: str, token_hash: str, *, secret: str) -> bool: """مقایسه امن (constant-time) توکن خام با hash ذخیره‌شده.""" expected = hash_token(token, secret=secret) return hmac.compare_digest(expected, token_hash) def generate_token(length: int = 48) -> str: """تولید توکن تصادفی امن به‌صورت URL-safe.""" return secrets.token_urlsafe(length) @dataclass class CurrentUser: """کاربر احراز هویت‌شده جاری (از JWT استخراج می‌شود).""" user_id: str username: str | None = None email: str | None = None roles: list[str] = field(default_factory=list) tenant_id: str | None = None def has_role(self, role: str) -> bool: return role in self.roles @dataclass class InternalServiceIdentity: """هویت یک سرویس داخلی که با InternalServiceToken احراز شده است.""" service_key: str scopes: list[str] = field(default_factory=list) def has_scope(self, scope: str) -> bool: return "*" in self.scopes or scope in self.scopes