【PHP】双方接口通信校验服务

请求方 使用

ApiAuthService::buildUrl($domain, ['terminal' => 1, 'ts' => time()]);
//http://域名/adminapi/login/platformLogin?sign=F7FE8A150DEC18BE8A71C5059742C81A&terminal=1&ts=1736904841

接收方

 $getParams = $this->request->get();$validate = ApiAuthService::check($getParams);if (!$validate) {return $this->fail('签名验证失败');}
<?phpnamespace app\adminapi\service;/*** 服务*/
class ApiAuthService
{const SECRET = '加密KEY';/*** 验证请求的合法性** 该方法主要用于验证来自第三方的请求是否合法通过对比请求参数中的签名和服务器生成的签名是否一致* 同时,它还会检查请求的时间戳以确保请求在允许的时间范围内发出,以防止过期请求被接受** @param array $params 包含请求参数的数组,应包括签名(sign)和时间戳(ts)* @return bool 如果签名验证通过且时间戳在有效范围内,则返回true;否则返回false* @author Harvey* @date 2025/1/14 11:23*/public static function check($params){// 提取签名$sign = $params['sign'] ?? '';// 移除签名参数,以便在后续步骤中重新计算签名unset($params['sign']);// 检查参数中是否包含时间戳if (!array_key_exists('ts', $params)) {return false;}// 获取当前时间戳$ts = time();// 检查时间戳是否在允许的范围内(当前时间前后300秒内)if ($ts < $params['ts'] || $ts - 300 > $params['ts']) {return false;}// 使用剩余参数和密钥生成MD5签名$md5_str = self::getSign($params, self::SECRET);// 记录调试信息trace('我方生成的sign值');trace($md5_str);// 比较生成的签名和接收到的签名是否一致return strcmp($md5_str, $sign) == 0 ? true : false;}/*** 生成签名字符串* * - 对参数进行数组排序* * - 将secret放到数组最前面* * - 将数组进行url编码* * - 将url编码后的字符串进行md5加密* * - 将md5加密后的字符串进行大写* @param $params* @param $code* @return string* @author Harvey* @date 2025/1/14 10:56*/public static function getSign($params, $code){ksort($params);$params = array_merge(['secret' => $code], $params);$params_str = http_build_query($params);return strtoupper(md5($params_str));}/*** 构建URL** 该方法用于将给定的域名、参数和密钥组合成一个带有查询字符串的URL* 它首先将密钥添加到参数数组中,然后将所有参数转换为查询字符串格式,* 并将其附加到域名后面** @param string $url 接口,例如 'http://example.com'* @param array $params 查询参数数组,例如 ['key1' => 'value1', 'key2' => 'value2']* @param string $secret 默认使用类常量SECRET作为密钥,可以通过传递不同的密钥来覆盖默认值** @return string 返回构建好的完整URL,例如 'http://example.com?key1=value1&key2=value2&secret=your_secret'** @author Harvey* @date 2023-10-05 14:30:00*/public static function buildUrl($url, $params, $secret = self::SECRET){// 将密钥与参数数组合并,确保密钥作为第一个参数$sign = self::getSign($params, $secret);$params = array_merge(['sign' => $sign], $params);// 将参数数组转换为查询字符串,并将其附加到域名后面return $url . '?' . http_build_query($params);}/*   public function test(){$sign = PlatformService::getSign(['u' => 1,'a' => 1,'ts' => time(),], PlatformService::SECRET);dump($sign);dump(PlatformService::check(['u' => 1,'a' => 1,'ts' => time(),'sign' => $sign,]));}*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2994.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb相关内容

Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载&#xff1a;https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一&#xff1a; 方式2&#xff1a; 方式3&#…

RabbitMQ前置概念

文章目录 1.AMQP协议是什么&#xff1f;2.rabbitmq端口介绍3.消息队列的作用和使用场景4.rabbitmq工作原理5.整体架构核心概念6.使用7.消费者消息推送限制&#xff08;work模型&#xff09;8.fanout交换机9.Direct交换机10.Topic交换机&#xff08;推荐&#xff09;11.声明队列…

[Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图

目录 1. MAC安装环境 1. 1 Icarus Verilog 编译 1. 2 gtkwave 查看波形 2. 安装遇到的问题 2. 1 macOS cannot verify that this app is free from malware 2. 2 gtkwave-bin is not compatible with macOS 14 or later 3. 运行示例 3. 1 源代码 3. 2 编译Verilog 3. 3 生成.v…

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站&#xff0c;例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考&#xff0c;我们只指导https://www.example.com/ 但不知道它下面有什么文件&#xff0c;文…

如何制作符合自己设备的FLM下载算法

如何制作符合自己设备的FLM下载算法 --------以I.MXRT1062 QSPI FLAH为例&#xff08;串行qspi nor flash&#xff09; 本文介绍一种基于i.mxrt1062的外挂flah的qspi nor flash下载算法FLM的一种方法&#xff0c;Flash 编程算法是一种用于擦除或下载应用程序到 Flash 设备的软…

LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读

LLMs之RAG&#xff1a;《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读 导读&#xff1a;这篇论文针对在资源受限的边缘设备上部署检索增强生成 (RAG) 系统的挑战&#xff0c;提出了一种名为 EdgeRAG 的高效方法。EdgeRAG 通过巧妙地结合预计算、在线生成和缓存策…

基于Java的百度AOI数据解析与转换的实现方法

目录 前言 一、AOI数据结构简介 1、官网的实例接口 2、响应参数介绍 二、Java对AOI数据的解析 1、数据解析流程图 2、数据解析实现 3、AOI数据解析成果 三、总结 前言 在当今信息化社会&#xff0c;地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

2013年IMO几何预选题第4题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB < AC AB<AC. P P P, Q Q Q 是直线 A C AC AC 上的两个不同的点, 满足 ∠ P B A ∠ Q B A ∠ A C B \angle PBA \angle QBA \angle ACB ∠PBA∠QBA∠ACB, 且 A A A 在 P P P 与 C C C 之间. 已知在线段…

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…

网络科技有限公司网络设计

网络科技有限公司网络设计 摘要&#xff1a;伴随着信息科技发展&#xff0c;上网变得一件必不可少的事情&#xff0c;当然网络安全对我们也是越来越重要。像我们的传统网结构是无法为我们的上网提供一个安全的网络环境。锐雯网络科技有限公司就是以网络安全为基本的对网络惊醒…

【c++】哈希

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 目录 1. unordered系列关联式容器1.1 unordered_map1.2 接口函数 例题 2.哈希概念2.1哈希冲突2.2哈希函数2.3哈希冲突解决2.3.1线性探测二次探测 2.3.2开散列 3. 封装迭代器封装完整代码&a…

@Query(org.springframework.data.jpa.repository.Query)

文章目录 1. findPAProductByAdminId 方法作用&#xff1a;解释&#xff1a; 2. findPaginatedPAProductByAdminId 方法作用&#xff1a;解释&#xff1a; 总结&#xff1a; package com.productQualification.resource.repository.productAuthentication;import com.productQu…

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

STM32网络通讯之CubeMX实现LWIP项目设计(十五)

STM32F407 系列文章 - ETH-LWIP-CubeMX&#xff08;十五&#xff09; 目录 前言 一、软件设计 二、CubeMX实现 1.配置前准备 2.CubeMX配置 1.ETH模块配置 2.时钟模块配置 3.中断模块配置 4.RCC及SYS配置 5.LWIP模块配置 3.生成代码 1.main文件 2.用户层源文件 3.…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

【Qt】03-页面切换

前言一、按键实现界面切换1.1 创建新的类文件1.1.1 创建1.1.2 细节选择 1.2 代码以及需要注意的点mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 1.3 结果展示 二、signal关键字2.1 代码以及解释mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h解释 2.2 现象 三…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…