EncryptMiddleware.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop100%开源免费商用商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | 商业版本务必购买商业授权,以免引起法律纠纷
  8. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  9. // | gitee下载:https://gitee.com/likeshop_gitee
  10. // | github下载:https://github.com/likeshop-github
  11. // | 访问官网:https://www.likeshop.cn
  12. // | 访问社区:https://home.likeshop.cn
  13. // | 访问手册:http://doc.likeshop.cn
  14. // | 微信公众号:likeshop技术社区
  15. // | likeshop团队 版权所有 拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshopTeam
  18. // +----------------------------------------------------------------------
  19. namespace app\openapi\http\middleware;
  20. use app\common\service\JsonService;
  21. use app\openapi\service\OpenApiService;
  22. /**
  23. * 加密验证中间件
  24. * Class EncryptMiddleware
  25. * @package app\openapi\http\middleware
  26. */
  27. class EncryptMiddleware
  28. {
  29. /**
  30. * 加密验证处理
  31. * @param $request
  32. * @param \Closure $next
  33. * @return mixed
  34. */
  35. public function handle($request, \Closure $next)
  36. {
  37. // 获取请求头中的认证信息
  38. $appId = $request->header('AppId');
  39. $timestamp = $request->header('Timestamp');
  40. $nonce = $request->header('Nonce');
  41. $signature = $request->header('Signature');
  42. // 验证必要参数
  43. if (empty($appId) || empty($timestamp) || empty($nonce) || empty($signature)) {
  44. return JsonService::fail('缺少必要的认证参数', [], 401);
  45. }
  46. // // 验证时间戳(防重放攻击,5分钟内有效)
  47. // if (abs(time() - $timestamp) > 300) {
  48. // return JsonService::fail('请求时间戳无效', [], 401);
  49. // }
  50. // 验证应用信息
  51. $appInfo = OpenApiService::getAppInfo($appId);
  52. if (empty($appInfo)) {
  53. return JsonService::fail('无效的应用ID', [], 401);
  54. }
  55. if ($appInfo['status'] != 1) {
  56. return JsonService::fail('应用已被禁用', [], 401);
  57. }
  58. // 验证签名
  59. $params = $request->param();
  60. outFileLog($params,'sign','$params');
  61. outFileLog($appInfo['app_secret'],'sign','app_secret');
  62. outFileLog($timestamp,'sign','$timestamp');
  63. outFileLog($nonce,'sign','$nonce');
  64. if (!OpenApiService::verifySignature($params, $appInfo['app_secret'], $timestamp, $nonce, $signature)) {
  65. return JsonService::fail('签名验证失败', [], 401);
  66. }
  67. // // 验证随机数(防重复攻击)
  68. // if (!OpenApiService::verifyNonce($appId, $nonce, $timestamp)) {
  69. // return JsonService::fail('重复的请求', [], 401);
  70. // }
  71. // 将应用信息传递给控制器
  72. $request->appInfo = $appInfo;
  73. return $next($request);
  74. }
  75. }