AuthTokenMiddleWare.php 3.7 KB

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