CheckSign.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Cache\UserCache;
  4. use App\Consts\ErrorConst;
  5. use App\Libs\Utils;
  6. use App\Models\Channel\Channel;
  7. use Closure;
  8. use App\Exceptions\ApiException;
  9. use Illuminate\Support\Facades\Log;
  10. class CheckSign
  11. {
  12. /**
  13. * @param $request
  14. * @param Closure $next
  15. * @return mixed
  16. * @throws ApiException
  17. */
  18. public function handle($request, Closure $next)
  19. {
  20. $params = $request->all();
  21. $token = $request->header('d-token', '');
  22. $token_data = UserCache::getTokenData($token);
  23. // 未登录跳过验签
  24. if (!getProp($token_data, 'uid')) return $next($request);
  25. $uid = getProp($token_data, 'uid');
  26. // 老用户跳过验签
  27. if ($uid <= 479) return $next($request);
  28. $referer_url = '';
  29. if (isset($params['_url'])) {
  30. $referer_url = $params['_url'];
  31. unset($params['_url']);
  32. }
  33. // 先验签(非本地模式需要验签)
  34. if (env('CHECK_SIGN') && $params) {
  35. $param_sign = getProp($params, 'sign');
  36. $timestamp = getProp($params, 'timestamp');
  37. if (!getProp($params, 'nonce_str') || !$timestamp) {
  38. Log::info('验签失败, 请求参数不正确;传参: '.json_encode($params, 256));
  39. Utils::throwError('1002:数据异常,请求参数不正确');
  40. }
  41. if (time() - $timestamp > 300) {
  42. Log::info('验签失败, 签名5分钟内有效;传参: '.json_encode($params, 256));
  43. Utils::throwError('1002:数据异常,请求参数不正确');
  44. }
  45. foreach ($params as $k=>$v) {
  46. if (!$v) unset($params[$k]);
  47. }
  48. unset($params['sign']);
  49. ksort($params);
  50. $str = strtoupper(http_build_query($params));
  51. $sign = md5($str.'&key='.env('SIGN_SALT'));
  52. if ($param_sign != $sign) {
  53. $params['_url'] = $referer_url;
  54. $params['sign'] = $param_sign;
  55. $params['check_sign'] = $sign;
  56. $params['check_str'] = $str.'&key='.env('SIGN_SALT');
  57. Log::info('验签失败, 签名不正确;传参: '.json_encode($params, 256));
  58. Utils::throwError('1002:数据异常,请求参数不正确');
  59. }
  60. }
  61. return $next($request);
  62. }
  63. }