AuthSignMiddleWare.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace app\api\middleware;
  3. use app\common\service\SystemConfigService;
  4. use app\Request;
  5. use interfaces\MiddlewareInterface;
  6. use think\cache\driver\Redis;
  7. use think\facade\Config;
  8. use think\Response;
  9. use utils\RedisCache;
  10. class AuthSignMiddleWare implements MiddlewareInterface
  11. {
  12. /*
  13. * 允许跨域的域名
  14. */
  15. protected $cookieDomain;
  16. public function handle(Request $request, \Closure $next)
  17. {
  18. $this->cookieDomain = Config::get('cookie.domain', '');
  19. $header = Config::get('cookie.header');
  20. $origin = $request->header('origin');
  21. if ($origin && ('' == $this->cookieDomain || strpos($origin, $this->cookieDomain)))
  22. $header['Access-Control-Allow-Origin'] = $origin;
  23. if ($request->method(true) == 'OPTIONS') {
  24. $response = Response::create('ok')->code(200)->header($header);
  25. }
  26. // 站点升级访问验证
  27. $isUpdate = SystemConfigService::make()->getConfigByName('site_web_is_update');
  28. $isUpdate = $isUpdate? $isUpdate : env('APP.WEB_IS_UPDATE');
  29. if ($isUpdate==1){
  30. // 非测试IP访问,直接拦截
  31. $config = SystemConfigService::make()->getConfigByNames(['site_update_tips','site_access_ips']);
  32. $updateTip = isset($config['site_update_tips'])? trim($config['site_update_tips']) : '';
  33. $accessIps = isset($config['site_access_ips'])? trim($config['site_access_ips']) : '';
  34. $updateTip = $updateTip? $updateTip : '网站升级中';
  35. $accessIps = $accessIps? $accessIps : env('APP.TEST_IPS');
  36. $currentIp = get_client_ip();
  37. if(empty($accessIps) || ($accessIps && !preg_match("/{$currentIp}/", $accessIps))){
  38. return api_error_return(['msg'=> $updateTip, 'data'=>['tips'=>$updateTip,'is_update'=>true,'ip'=> $currentIp]]);
  39. }
  40. }
  41. if (RedisCache::get('is_update_data')){
  42. return api_error_return(['msg'=>'更新数据中,请稍后几秒', 'data'=>null]);
  43. }
  44. if (env('API.IS_PUBLIC_REQUEST_VERIFY')){
  45. if (ISNOTREQUESTPASS($request->param())){
  46. return api_error_return(['msg'=>'参数错误', 'data'=>null]);
  47. }
  48. }
  49. // 验证sign
  50. if (env('API.IS_SIGN_VERIFY')){
  51. if (empty($request->param('sign'))){
  52. return api_error_return(['msg'=>'签名不存在', 'data'=>null]);
  53. }
  54. $sign = createApiSign($request->param());
  55. if ($request->param('sign') != $sign){
  56. return api_error_return(['msg'=>'签名错误', 'data'=>['aa'=>$sign]]);
  57. }
  58. if (time() - $request->post('timestamp') > 20){
  59. return api_error_return(['msg'=>'请求失败,稍后再试', 'data'=>null]);
  60. }
  61. }
  62. return $next($request);
  63. }
  64. }