AuthorizingApi.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Services\UserService;
  4. use Closure;
  5. use Firebase\JWT\ExpiredException;
  6. use Firebase\JWT\JWT;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\Auth;
  9. use Illuminate\Support\Facades\Cache;
  10. class AuthorizingApi
  11. {
  12. /**
  13. * Handle an incoming request.
  14. *
  15. * @param Request $request
  16. * @param Closure $next
  17. * @return mixed
  18. */
  19. public function handle(Request $request, Closure $next)
  20. {
  21. $token = $request->header("token");
  22. /**
  23. * @var UserService $service
  24. */
  25. $service = app("UserService");
  26. if (!$token) return response()->json([
  27. 'message' => '没有认证,请前去认证',
  28. 'status_code' => 401,
  29. ]);
  30. try {
  31. $publicKey = Cache::remember("TOKEN_PUBLIC_KEY",7200,function (){
  32. return file_get_contents(base_path().'/public.pem');
  33. });
  34. }catch (\Exception $e){
  35. $response["status_code"] = 410;
  36. if (strpos($e->getMessage(),"No such file or directory")!==false)$response["message"] = "服务器异常,资源丢失";
  37. else $response["message"] = "访问某些资源失败";
  38. return response()->json($response);
  39. }
  40. try {
  41. $payload = JWT::decode($token, $publicKey, ['RS256']);
  42. $user = $service->getOrRefreshCache($payload->data->id,$payload->exp);
  43. if (!$service->verifySingleTag($user->id, $token)){
  44. $response["status_code"] = 407;
  45. $response["message"] = "账号已在别处登录";
  46. return response()->json($response);
  47. }
  48. }catch (ExpiredException $e){
  49. $response["status_code"] = 401;
  50. $response["message"] = "token失效";
  51. return response()->json($response);
  52. } catch (\Exception $e){
  53. $response["status_code"] = 401;
  54. $response["message"] = "token非法";
  55. return response()->json($response);
  56. }
  57. Auth::setUser($user);
  58. return $next($request);
  59. }
  60. }