Authenticate.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /*
  3. * This file is part of the Jiannei/lumen-api-starter.
  4. *
  5. * (c) Jiannei <longjian.huang@foxmail.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace App\Http\Middleware;
  11. use App\Repositories\Enums\ResponseCodeEnum;
  12. use App\Support\Traits\LoginLimit;
  13. use Closure;
  14. use Illuminate\Auth\Access\AuthorizationException;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\Log;
  18. use Tymon\JWTAuth\Exceptions\JWTException;
  19. use Tymon\JWTAuth\Exceptions\TokenExpiredException;
  20. use Tymon\JWTAuth\Exceptions\TokenInvalidException;
  21. use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;
  22. //class Authenticate extends BaseMiddleware
  23. class Authenticate
  24. {
  25. use LoginLimit;
  26. public function __construct(\Illuminate\Contracts\Auth\Factory $auth)
  27. {
  28. $this->auth = $auth;
  29. }
  30. /**
  31. * Handle an incoming request.
  32. *
  33. * @param Request $request
  34. * @param Closure $next
  35. * @param string|null $guard
  36. * @return mixed
  37. *
  38. * @throws AuthorizationException
  39. */
  40. public function handle($request, Closure $next, $guard = null)
  41. {
  42. // Auth::setDefaultDriver($guard);
  43. // try {
  44. // // 检查此次请求中是否带有 token,如果没有则抛出异常。
  45. // $this->checkForToken($request);
  46. // } catch (TokenInvalidException $exception) {
  47. // abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, 'token有误');
  48. // }
  49. //
  50. // //1. 格式通过,验证是否是专属于这个的token
  51. // //获取当前守护的名称
  52. // $guard = Auth::getDefaultDriver();
  53. // Log::error("1");
  54. // //使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException 异常
  55. // //2. 此时进入的都是属于当前guard守护的token
  56. // try {
  57. // // 检测用户的登录状态,如果正常则通过
  58. // if ($this->auth->parseToken()->authenticate()) {
  59. // Log::error("2");
  60. // $token = Auth::getToken();
  61. // $user_id = $this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub'];
  62. // //单机登录检查
  63. // if (!$this->singleLoginCheck($token, $user_id, $guard)) {
  64. // Log::error("3");
  65. // abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, '该账号已经再其他设备上登录');
  66. // }
  67. // Log::error("4");
  68. // return $next($request);
  69. // }
  70. // Log::error("5");
  71. // abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, 'token过期,请重新登陆。');
  72. // } catch (TokenExpiredException $exception) {
  73. // // 3. 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中
  74. // try {
  75. // Log::error("6");
  76. // // 刷新用户的 token
  77. // $token = $this->auth->refresh();
  78. // // 使用一次性登录以保证此次请求的成功
  79. // $user_id = $this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub'];
  80. // Auth::onceUsingId($user_id);
  81. //
  82. // $this->singleLoginSetToken($user_id, $token, $guard);
  83. // Log::error("7");
  84. // return $this->setAuthenticationHeader($next($request), $token);
  85. // } catch (JWTException $exception) {
  86. // Log::error("8");
  87. // Log::error($exception);
  88. // // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。
  89. // abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, 'token令牌过期,请重新登陆。');
  90. // }
  91. // }
  92. // Log::error("9");
  93. // // 在响应头中返回新的 token
  94. // abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, '异常错误-Mead');
  95. if ($this->auth->guard($guard)->guest()) {
  96. abort(ResponseCodeEnum::HTTP_UNAUTHORIZED);
  97. }
  98. $token = Auth::getToken();
  99. $user_id = $this->auth->guard($guard)->id();
  100. //单机登录检查
  101. if (!$this->singleLoginCheck($token, $user_id, $guard)) {
  102. Log::error("3");
  103. abort(ResponseCodeEnum::HTTP_UNAUTHORIZED, '该账号已经再其他设备上登录');
  104. }
  105. return $next($request);
  106. }
  107. }