CheckSign.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. namespace app\middleware\api;
  3. use app\service\api\CheckSignServiceFacade;
  4. use app\service\ConfServiceFacade;
  5. use laytp\BaseMiddleware;
  6. use laytp\traits\JsonReturn;
  7. use think\Request;
  8. /**
  9. * 签名验证中间件
  10. * 签名生成方式:strtoupper(md5(md5($hearder['request-time']).md5(Config::get('laytp.api.signKey'))))
  11. * 签名验证方式:
  12. * 请求的header头中需要有两个参数:
  13. * - request-time = 当前请求的时间,这个单位并不要求固定,甚至传的都可以不是当前请求的时间,只要sign的值是使用这个参数的值按照规定的算法生成即可
  14. * - sign = md5(md5($hearder['request-time']).md5(Config::get('laytp.api.signKey')))
  15. * 此中间件,使用header头中request-time按照签名算法生成签名,然后与header中传递的sign参数比对,看是否一致,如果一致就通过验证,如果不一致就验证失败
  16. * 需要设计,有些方法无需验签。比如获取配置的接口,需要得到后台配置的Config::get('laytp.api.signKey')
  17. * Class CheckSign
  18. * @package app\middleware
  19. */
  20. class CheckSign extends BaseMiddleware
  21. {
  22. use JsonReturn;
  23. /**
  24. * 执行中间件
  25. * @param Request $request
  26. * @param \Closure $next
  27. * @return mixed
  28. */
  29. public function handle(Request $request, \Closure $next)
  30. {
  31. return $next($request);
  32. if (intval(ConfServiceFacade::get('system.basic.checkSign')) === 1) {
  33. if (CheckSignServiceFacade::needCheckSign()) {
  34. if (CheckSignServiceFacade::check()) {
  35. return $next($request);
  36. } else {
  37. if(env('APP_DEBUG')){
  38. return $this->error('签名验证失败',0, [
  39. '签名验证的规则描述' => '1. 后台系统配置->基础配置,Api签名开关需要打开,Api签名的Key需要设置(允许为空);2. 客户端在请求Api接口时,需要在header里面传递两个参数,request-time和sign,sign的值要等于strtoupper(md5(md5(header:request-time).md5(conf:signKey)))',
  40. '注意点' => '如果是使用的生成Api文档在线测试接口,请点击右上角Api请求配置将签名验证开关打开',
  41. '生成签名的规则' => 'strtoupper(md5(md5(header:request-time).md5(conf:signKey)))',
  42. '系统配置的生成签名的Key' => ConfServiceFacade::get('system.basic.signKey'),
  43. 'header部分传递的request-time值' => $request->header('request-time'),
  44. 'header部分传递的sign值' => $request->header('sign'),
  45. '后端计算的sign值' => CheckSignServiceFacade::getError()
  46. ]);
  47. }
  48. return $this->error(CheckSignServiceFacade::getError());
  49. }
  50. } else {
  51. return $next($request);
  52. }
  53. } else {
  54. return $next($request);
  55. }
  56. }
  57. }