必须实现JWT Token验证与接口签名机制:JWT用于无状态身份认证,通过firebase/php-jwt生成含user_id、exp等的令牌并校验;签名校验则基于timestamp、nonce和参数拼接+HMAC-SHA256防篡改与重放;二者整合为中间件统一过滤,配合HTTPS、密钥环境隔离及安全头配置保障移动端API安全。

如果您正在为移动端开发API接口,需要确保PHP后端具备安全的身份验证与请求防篡改能力,则必须实现Token验证与接口签名机制。以下是构建此类API的具体步骤:
一、实现基于JWT的Token验证流程
JWT(JSON Web Token)可将用户身份信息加密编码为无状态令牌,在每次请求中携带,服务端无需查询数据库即可完成身份校验,适用于高并发移动接口场景。
1、使用composer安装firebase/php-jwt库:composer require firebase/php-jwt。
2、用户登录成功后,生成JWT令牌:调用JWT::encode()方法,传入包含user_id、exp(过期时间)、iat(签发时间)等字段的payload,并使用服务器私有密钥签名。
3、将生成的token通过HTTP响应头Authorization: Bearer {token}或JSON响应体返回给APP端。
4、在受保护接口入口处,从请求头提取Bearer token,使用JWT::decode()配合相同密钥解码并验证exp、iat等声明,验证失败则返回401状态码。
二、设计请求级接口签名机制
接口签名用于防止请求被重放或篡改,要求客户端对请求参数、时间戳、随机字符串按约定规则排序拼接并HMAC-SHA256签名,服务端复现该过程比对结果。
1、约定客户端在请求中必须携带三个固定参数:timestamp(当前秒级时间戳)、nonce(一次性随机字符串)、sign(签名值)。
2、服务端接收请求后,先校验timestamp是否在允许偏差范围内(如±300秒),再检查nonce是否已在Redis中存在(存在则拒绝,防止重放)。
3、将除sign外的所有请求参数(包括timestamp、nonce)按键名升序排列,拼接为key1=value1&key2=value2格式,并在末尾追加预设的密钥字符串。
4、对拼接后的字符串执行hash_hmac('sha256', $string, $secret_key),将结果转为小写十六进制字符串,与客户端传入的sign比对。
三、整合Token验证与签名校验的中间件
将两类校验逻辑封装为统一入口过滤器,避免在每个接口方法中重复编写,提升代码可维护性与安全性一致性。
1、创建AuthMiddleware类,在__invoke方法中依次执行token解析、用户ID提取、签名验证三项操作。
2、若token无效,抛出异常并返回{"code":401,"msg":"Invalid token"};若签名不匹配,返回{"code":403,"msg":"Invalid signature"}。
3、校验通过后,将解码得到的user_id注入到请求对象属性中,供后续控制器直接读取,例如$request->user_id。
4、在路由定义中为需要保护的API组统一绑定该中间件,如Laravel中使用Route::middleware(['auth.api'])。
四、配置HTTPS与敏感信息隔离策略
Token与签名机制的有效性高度依赖传输层安全,且密钥等敏感数据不可硬编码于源码中,需通过环境隔离与运行时加载保障。
1、强制所有API接口仅响应HTTPS请求,Nginx配置中添加return 301 https://$host$request_uri;重定向规则。
2、将JWT密钥与签名密钥存入.env文件,使用$_ENV['JWT_SECRET']和$_ENV['API_SIGN_KEY']读取,禁止提交至版本库。
3、在PHP-FPM配置中禁用危险函数:在php.ini中设置disable_functions = exec,passthru,shell_exec,system,降低远程代码执行风险。
4、对所有输出JSON响应统一设置Content-Type头为application/json; charset=utf-8,并禁用X-Powered-By头泄露PHP版本。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











