#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، دامنه یا شعبه تغییر کند، درخواست با پیام خطای دقیق رد میشود.
- دریافت
access_tokenاز$request->dataو Decode با کلیدenv('JWT_SECRET_KEY'). - تحلیل User-Agent با
DeviceDetectorبرای استخراج اطلاعات مرورگر فعلی (نام و نسخه). - تابع داخلی
checkBrowser()مقایسهای بین مرورگر ثبتشده در توکن و مرورگر فعلی انجام میدهد. - اگر مرورگر تطبیق داشت، سپس IP بررسی میشود:
- اگر IP فعلی با
uipدر توکن یا با یکی از IPهای خصوصی (10.* / 192.168.* / 172.16.*) همخوانی داشت، ادامه داده میشود.
- اگر IP فعلی با
- تطبیق دامنه
issبا هدر Domain درخواست. - تطبیق شناسه شعبه
brnبا ورودیbranchدرخواست. - در صورت قبولی همه مراحل: یافتن اپراتور فعال (status=1، بدون بلوک).
- تولید توکن جدید با ساختار زیر:
{
"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. |
{
"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) بر اساس منطقه جغرافیایی کاربر.