CheckToken.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\User;
  4. use App\Models\UserSession;
  5. use Closure;
  6. use Illuminate\Http\Request;
  7. class CheckToken
  8. {
  9. private const ACTIVITY_WRITE_INTERVAL = 60;
  10. /**
  11. * 处理传入请求
  12. *
  13. * @param \Illuminate\Http\Request $request
  14. * @param \Closure $next
  15. * @return mixed
  16. */
  17. public function handle(Request $request, Closure $next)
  18. {
  19. // 1. 前台沿用 Authorization 请求头中的原始 Token
  20. $token = $request->header('authorization');
  21. // 2. 如果请求头没有 token,直接返回未授权
  22. if (empty($token)) {
  23. return response()->json([
  24. 'code' => 401,
  25. 'msg' => lang('请携带token访问')
  26. ], 401);
  27. }
  28. // 3. 查询 user_session:token 存在 + 未过期
  29. $time = now()->getTimestamp();
  30. $session = UserSession::where('token', $token)
  31. ->where('expire_time', '>', $time)
  32. ->first();
  33. // 4. 会话不存在或已过期
  34. if (!$session || UserSession::validUntil($session->getAttributes()) <= $time) {
  35. return response()->json([
  36. 'code' => 401,
  37. 'msg' => lang('token无效或已过期')
  38. ], 401);
  39. }
  40. // 5. 查询对应用户信息
  41. $user = User::where('user_id',$session->user_id)->first();
  42. // 6. 用户不存在
  43. if (!$user || !empty($user->getAttributes()['delete_time'])) {
  44. return response()->json([
  45. 'code' => 401,
  46. 'msg' => lang('用户不存在')
  47. ], 401);
  48. }
  49. if ((int)($user->getAttributes()['is_banned'] ?? 0) === 1) {
  50. return response()->json(['code' => 401, 'msg' => lang('账号已禁用')], 401);
  51. }
  52. if (!UserSession::renewActiveToken((string)$token, $time, (int)$session->id)) {
  53. return response()->json(['code' => 401, 'msg' => lang('token无效或已过期')], 401);
  54. }
  55. $attributes = $user->getAttributes();
  56. $cutoff = $time - self::ACTIVITY_WRITE_INTERVAL;
  57. if (array_key_exists('last_active_time', $attributes) && (int) $attributes['last_active_time'] <= $cutoff) {
  58. User::whereKey($user->getKey())
  59. ->where(fn ($query) => $query->whereNull('last_active_time')->orWhere('last_active_time', '<=', $cutoff))
  60. ->toBase()->update(['last_active_time' => $time]);
  61. }
  62. // 7. 把用户信息赋值给 $request->user
  63. $request->user = $user;
  64. // 8. 放行请求,进入控制器
  65. return $next($request);
  66. }
  67. }