AuthTokenMiddleWare.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\api\middleware;
  4. use app\Request;
  5. use app\api\services\UserAuthServices;
  6. use interfaces\MiddlewareInterface;
  7. use utils\RedisCache;
  8. class AuthTokenMiddleWare implements MiddlewareInterface
  9. {
  10. /**
  11. * 处理请求
  12. * @param Request $request
  13. * @param \Closure $next
  14. * @return mixed
  15. * @throws \Psr\SimpleCache\InvalidArgumentException
  16. */
  17. public function handle (Request $request, \Closure $next)
  18. {
  19. try {
  20. if (env('APP.WEB_IS_UPDATE') ){
  21. // 非测试IP访问,直接拦截
  22. $testIp = env('APP.TEST_IPS');
  23. $testIps = $testIp? $testIp : '';
  24. $currentIp = get_client_ip();
  25. if($testIps && !preg_match("/{$currentIp}/", $testIps)){
  26. return api_error_return(['msg'=>'网站正在升级中', 'data'=>['ips'=> $testIps,'ip'=> $currentIp]]);
  27. }
  28. }
  29. if (RedisCache::get('is_update_data')){
  30. return api_error_return(['msg'=>'更新数据中,请稍后几秒', 'data'=>null]);
  31. }
  32. if (env('API.IS_PUBLIC_REQUEST_VERIFY')){
  33. if (ISNOTREQUESTPASS($request->param())){
  34. return api_error_return(['msg'=>'参数错误', 'data'=>null]);
  35. }
  36. }
  37. if (env('API.IS_SIGN_VERIFY')){
  38. if (empty($request->param('sign'))){
  39. return api_error_return(['msg'=>'签名不存在', 'data'=>null]);
  40. }
  41. $sign = createApiSign($request->param());
  42. if ($request->param('sign') != $sign){
  43. return api_error_return(['msg'=>'签名错误', 'data'=>['aa'=>$sign]]);
  44. }
  45. if (time() - $request->post('timestamp') > 20){
  46. return api_error_return(['msg'=>'请求失败,稍后再试', 'data'=>null]);
  47. }
  48. }
  49. $token = trim($request->header('token', ''));
  50. if (empty($token)){
  51. return api_error_return(['msg'=>'请登录', 'code'=>401]);
  52. }else{
  53. try {
  54. /** @var UserAuthServices $service */
  55. $service = app()->make(UserAuthServices::class);
  56. $user_info = $service->parseToken($token);
  57. $authInfo = $service->parseToken($token)->toArray();
  58. } catch (\Exception $e) {
  59. return api_error_return(['msg'=>$e->getMessage(), 'code'=>401]);
  60. }
  61. $data = $request->param(); // 请求参数
  62. $request->uid = is_null($authInfo) ? 0 : $authInfo['id']; // 用户uid
  63. $data['uid'] = $request->uid;
  64. $request->data = $data;
  65. $request->user = is_null($authInfo) ? null : $authInfo; // 用户信息
  66. $request->user_info = $user_info ?: null; // 用户信息
  67. $request->isLogin = true;
  68. }
  69. } catch (\Throwable $e) {
  70. return api_error_return($e->getMessage());
  71. }
  72. return $next($request);
  73. }
  74. }