AuthorizingApi.php 1.6 KB

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