CheckToken.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. /**
  10. * 处理传入请求
  11. *
  12. * @param \Illuminate\Http\Request $request
  13. * @param \Closure $next
  14. * @return mixed
  15. */
  16. public function handle(Request $request, Closure $next)
  17. {
  18. // 1. 从请求头获取 token(header 名称:token / Token 都支持)
  19. $token = $request->header('authorization');
  20. // 2. 如果请求头没有 token,直接返回未授权
  21. if (empty($token)) {
  22. return response()->json([
  23. 'code' => 401,
  24. 'msg' => lang('请携带token访问')
  25. ], 401);
  26. }
  27. // 3. 查询 user_session:token 存在 + 未过期
  28. $time = now()->getTimestamp();
  29. $session = UserSession::where('token', $token)
  30. ->where('expire_time', '>', $time)
  31. ->first();
  32. // 4. 会话不存在或已过期
  33. if (!$session || UserSession::validUntil($session->getAttributes()) <= $time) {
  34. return response()->json([
  35. 'code' => 401,
  36. 'msg' => lang('token无效或已过期')
  37. ], 401);
  38. }
  39. // 5. 查询对应用户信息
  40. $user = User::where('user_id',$session->user_id)->first();
  41. // 6. 用户不存在
  42. if (!$user) {
  43. return response()->json([
  44. 'code' => 401,
  45. 'msg' => lang('用户不存在')
  46. ], 401);
  47. }
  48. if (!UserSession::renewActiveToken((string)$token, $time, (int)$session->id)) {
  49. return response()->json(['code' => 401, 'msg' => lang('token无效或已过期')], 401);
  50. }
  51. // 7. 把用户信息赋值给 $request->user
  52. $request->user = $user;
  53. // 8. 放行请求,进入控制器
  54. return $next($request);
  55. }
  56. }