JwtAuthMiddleware.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\Redis;
  5. use Tymon\JWTAuth\Exceptions\JWTException;
  6. use Tymon\JWTAuth\Exceptions\TokenExpiredException;
  7. use Tymon\JWTAuth\Exceptions\TokenInvalidException;
  8. use Tymon\JWTAuth\Facades\JWTAuth;
  9. class JwtAuthMiddleware
  10. {
  11. /**
  12. * Handle an incoming request.
  13. *
  14. * @param \Illuminate\Http\Request $request
  15. * @param \Closure $next
  16. * @return mixed
  17. */
  18. public function handle($request, Closure $next)
  19. {
  20. try {
  21. $token = JWTAuth::getToken();
  22. if(empty($token)){
  23. $error = [
  24. 'message' => 'token is required',
  25. 'code' => 401,
  26. ];
  27. return response()->json($error)->setStatusCode(401);
  28. }
  29. $data = JWTAuth::decode($token)['user'];
  30. //检测token是否存在黑名单中
  31. if(Redis::zscore('blacklist_token', $token->get())){
  32. $error = [
  33. 'message' => 'token in blacklist',
  34. 'code' => 401,
  35. ];
  36. return response()->json($error)->setStatusCode(401);
  37. }
  38. if ($data->sign !== md5($data->uid . config('customer.jwt_secret'))) {
  39. $error = [
  40. 'message' => 'request is not allow',
  41. 'code' => 401,
  42. ];
  43. return response()->json($error);
  44. }
  45. } catch (TokenExpiredException $e) {
  46. $error = [
  47. 'message' => 'Token is Expired',
  48. 'code' => 401,
  49. ];
  50. return response()->json($error)->setStatusCode(401);
  51. } catch (TokenInvalidException $e) {
  52. $error = [
  53. 'message' => $e->getMessage(),
  54. 'code' => 401,
  55. ];
  56. return response()->json($error)->setStatusCode(401);
  57. } catch (JWTException $e) {
  58. $error = [
  59. 'message' => $e->getMessage(),
  60. 'code' => 401,
  61. ];
  62. return response()->json($error)->setStatusCode(401);
  63. }catch (\Exception $e){
  64. $error = [
  65. 'message' => $e->getMessage(),
  66. 'code' => 401,
  67. ];
  68. return response()->json($error)->setStatusCode(401);
  69. }
  70. return $next($request);
  71. }
  72. }