Skip to main content
#P1392

POST /api/auth/access-token

Route Info

Method Endpoint Controller Middleware Purpose تگ Swagger
POST /api/auth/access-token UserController@accessToken domainAccess, ipTrust تولید توکن دسترسی جدید پس از تطبیق مرورگر، IP، دامنه و شعبه. tags={"Auth"}

توضیح عملکرد (Function Logic)

این Endpoint، اعتبار و اصالت توکن فعلی کاربر را پس از Decode بررسی کرده و در صورت تطبیق پارامترهای امنیتی، توکن جدید ۷ روزه صادر می‌کند. اگر هر کدام از فاکتورهای مرورگر، IP، دامنه یا شعبه تغییر کند، درخواست با پیام خطای دقیق رد می‌شود.
  1. دریافت access_token از $request->data و Decode با کلید env('JWT_SECRET_KEY').
  2. تحلیل User-Agent با DeviceDetector برای استخراج اطلاعات مرورگر فعلی (نام و نسخه).
  3. تابع داخلی checkBrowser() مقایسه‌ای بین مرورگر ثبت‌شده در توکن و مرورگر فعلی انجام می‌دهد.
  4. اگر مرورگر تطبیق داشت، سپس IP بررسی می‌شود:
    • اگر IP فعلی با uip در توکن یا با یکی از IPهای خصوصی (10.* / 192.168.* / 172.16.*) هم‌خوانی داشت، ادامه داده می‌شود.
  5. تطبیق دامنه iss با هدر Domain درخواست.
  6. تطبیق شناسه شعبه brn با ورودی branch درخواست.
  7. در صورت قبولی همه مراحل: یافتن اپراتور فعال (status=1، بدون بلوک).
  8. تولید توکن جدید با ساختار زیر:
{
  "typ": "base",
  "iss": "domain.com",
  "aud": "domain.com",
  "iat": 1731964000,
  "nbf": 1731964000,
  "exp": 1732568800,       // 7 روز
  "uuid": 54,
  "brn": 2,
  "uip": "10.0.0.15",
  "brw": { "name": "Chrome", "version": "122.0", "type": "browser" }
}

بدنه درخواست (Request Body)

پارامتر نوع داده الزامی توضیح
data.access_token string (JWT) بله توکن فعلی کاربر که باید توسط سرور Decode و اعتبارسنجی شود.
branch integer بله شناسه شعبه فعلی جهت تطبیق با اطلاعات درون توکن.
POST /api/auth/access-token
Content-Type: application/json
Domain: example.domain

{
  "branch": 2,
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6..."
  }
}

پاسخ موفق (Response - Success)

{
  "user": {
    "uuid": 54,
    "from": "users",
    "role": "admin",
    "isAirPlusAdmin": true,
    "group": "core",
    "data": {
      "displayName": "Ali Pour",
      "email": "a.pour@example.ir",
      "photoURL": "https://storage.service01.ir/media/avatar/robot.png",
      "services": { "telegram": false },
      "personnelId": "P00999",
      "branch": [0,1],
      "access": [ ... ],
      "shortcuts": ["temporary-registration","online-ticket","trade-management","customers"]
    }
  },
  "access_token": "new.jwt.token.generated"
}

پاسخ‌های خطا (Error Types)

نوع خطا شرح خطا
changeBrowser مرورگر فعلی با مرورگر آخرین ورود مطابقت ندارد.
changeIp IP متغیر یا استفاده از VPN.
جزئیات: شامل IP فعلی و IP درج‌شده در توکن.
changeDomain دامنه درخواست با دامنه صادرکننده توکن هم‌خوانی ندارد.
changeBranch شناسه شعبه تغییر کرده (مثلاً انتقال کاربر بین شعبات).
personnelId نامعتبر بودن توکن یا خطای رمزگشایی JWT.
نمونه خطای تغییر IP:
{
  "error": {
    "type": "changeIp",
    "message": "وضعیت اینترنت شما تغییر پیدا کرده",
    "details": {
      "token_ip": "10.1.1.2",
      "current_ip": "45.66.88.100"
    }
  }
}

تولید JWT جدید

توکن جدید با کتابخانه firebase/php-jwt و الگوریتم HS256 تولید می‌شود؛ مدت اعتبار آن ۷ روز (۶۰۴٬۸۰۰ ثانیه) است. اطلاعات کلیدی آن شامل شناسه کاربر، شناسه شعبه، مرورگر و IP فعلی است.

تحلیل امنیتی

  • احراز چندمرحله‌ای محیطی: کنترل همزمان ۴ عامل (Browser + IP + Domain + Branch) قبل از احیای توکن.
  • محافظت از سوریه توکن: جلوگیری از استفاده از JWT در مرورگر یا شبکه دیگر.
  • تأیید دامنه صدور: مقایسه مقدار iss در هدر JWT با مقدار هدر درخواست (Domain).
  • دسترسی کنترل‌شده Redis: بارگذاری میانبرهای رابط سیستم از مسیر cache محدود.
  • ⚠️ توصیه: اعمال نرخ محدودسازی (Rate Limiting) برای جلوگیری از حمله بروت‌فورس JWT.

وابستگی‌ها (Dependencies)

  • use Firebase\JWT\JWT;
  • use Firebase\JWT\Key;
  • use DeviceDetector\DeviceDetector;
  • use DeviceDetector\ClientHints;
  • use DeviceDetector\Parser\AbstractDeviceParser;
  • use Carbon\Carbon;
  • use Illuminate\Support\Facades\Redis;
  • use App\Models\User;

پیوست نگهداری و توسعه بعدی

  • اضافه‌کردن بررسی Device ID یکتا برای جلوگیری از جعل User-Agent.
  • افزودن refresh-token مجزا برای دسترسی موقت با سطح محدود (scoped access).
  • ذخیره لاگ تغییر IPها در SystemLog جهت تحلیل تهدیدات.
  • اعمال Expiration Dynamics (IP-based TTL) بر اساس منطقه جغرافیایی کاربر.