AuthTokenMiddleWare.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 think\cache\driver\Redis;
  8. use think\facade\Config;
  9. use think\facade\Db;
  10. use think\Response;
  11. class AuthTokenMiddleWare implements MiddlewareInterface
  12. {
  13. // protected $data; // 请求数据
  14. /**
  15. * 处理请求
  16. * @param Request $request
  17. * @param \Closure $next
  18. * @return mixed
  19. * @throws \Psr\SimpleCache\InvalidArgumentException
  20. */
  21. public function handle (Request $request, \Closure $next)
  22. {
  23. try {
  24. if (env('APP.WEB_IS_UPDATE') ){
  25. // 非测试IP访问,直接拦截
  26. $testIp = env('APP.TEST_IPS');
  27. $testIps = $testIp? $testIp : '';
  28. $currentIp = get_client_ip();
  29. if($testIps && !preg_match("/{$currentIp}/", $testIps)){
  30. return api_error_return(['msg'=>'网站正在升级中', 'data'=>['ips'=> $testIps,'ip'=> $currentIp]]);
  31. }
  32. }
  33. $redis = new Redis();
  34. if ($redis->get('is_update_data')){
  35. return api_error_return(['msg'=>'更新数据中,请稍后几秒', 'data'=>null]);
  36. }
  37. if (env('API.IS_PUBLIC_REQUEST_VERIFY')){
  38. if (ISNOTREQUESTPASS($request->param())){
  39. return api_error_return(['msg'=>'参数错误', 'data'=>null]);
  40. }
  41. }
  42. if (env('API.IS_SIGN_VERIFY')){
  43. if (empty($request->param('sign'))){
  44. return api_error_return(['msg'=>'签名不存在', 'data'=>null]);
  45. }
  46. $sign = createApiSign($request->param());
  47. if ($request->param('sign') != $sign){
  48. return api_error_return(['msg'=>'签名错误', 'data'=>['aa'=>$sign]]);
  49. // return api_error_return(['msg'=>'签名错误', 'data'=>null]);
  50. }
  51. if (time() - $request->post('timestamp') > 20){
  52. return api_error_return(['msg'=>'请求失败,稍后再试', 'data'=>null]);
  53. }
  54. }
  55. // $controller = $request->controller(); // 类名
  56. // $action = $request->action(); // 方法名
  57. // $str = $controller . '/' . $action;
  58. // $notAuth = ['v1.User/userTool'];
  59. $token = trim($request->header('token', ''));
  60. if (empty($token)){
  61. return api_error_return(['msg'=>'请登录', 'code'=>401]);
  62. // if (in_array($str, $notAuth)){
  63. // $request->isLogin = false;
  64. //
  65. // }
  66. }else{
  67. try {
  68. /** @var UserAuthServices $service */
  69. $service = app()->make(UserAuthServices::class);
  70. $user_info = $service->parseToken($token);
  71. $authInfo = $service->parseToken($token)->toArray();
  72. } catch (\Exception $e) {
  73. return api_error_return(['msg'=>$e->getMessage(), 'code'=>401]);
  74. // return api_error_return(['msg'=>$e->getMessage(), 'code'=>$e->getCode()]);
  75. }
  76. $data = $request->param(); // 请求参数
  77. // if (isset($data['sign_str']))
  78. // $data['sign_str'] = trim_string($data['sign_str']);
  79. $request->uid = is_null($authInfo) ? 0 : $authInfo['id']; // 用户uid
  80. $data['uid'] = $request->uid;
  81. $request->data = $data;
  82. $request->user = is_null($authInfo) ? null : $authInfo; // 用户信息
  83. $request->user_info = $user_info ?: null; // 用户信息
  84. $request->isLogin = true;
  85. }
  86. } catch (\Throwable $e) {
  87. return api_error_return($e->getMessage());
  88. }
  89. return $next($request);
  90. }
  91. }