php 8.2 使用 firebase/php-jwt 实现 jwt 身份验证,核心是通过中间件校验 authorization 头中的 token,验证签名、过期与权限,并基于 scope 或 role 进行细粒度控制,密钥须安全存储、token 必须 https 传输。

PHP 8.2 实现 JWT 身份验证保护 API,核心是:用 firebase/php-jwt 库生成和校验 Token,配合中间件拦截请求、解析 Authorization 头,并验证签名、过期时间与用户权限。关键不是“写个 token”,而是确保每次请求都经过可信校验、敏感操作有作用域(scope)控制、密钥安全不硬编码。
安装依赖并配置 JWT 密钥
使用 Composer 安装官方推荐的 JWT 库:
composer require firebase/php-jwt
在配置文件(如 config.php)中定义密钥和算法,避免明文写死在逻辑里:
- 用
openssl_random_pseudo_bytes(32)生成 256 位随机密钥,存为环境变量或独立配置文件 - 推荐使用
HS256(对称加密),开发阶段够用;生产环境若需更高安全可选RS256(需配公私钥) - 密钥绝不提交到 Git,通过
.env或服务器环境变量加载
登录接口:签发带载荷的 Token
用户凭账号密码登录成功后,构造 Payload 并签名:
- 必须包含
iat(签发时间)、exp(过期时间,建议 ≤ 1 小时),防止长期有效 Token 泄露后被滥用 - 可加入
uid、role、scope等业务字段,后续权限判断直接从 Token 解析,不查库 - 用
JWT::encode()签名,设置JSON_UNESCAPED_UNICODE避免中文乱码
示例返回:
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expires_in": 3600
}
API 中间件:校验 Token 并注入用户上下文
所有受保护路由前,执行统一校验逻辑(如 Slim、Laravel 或原生 PHP 的前置钩子):
- 从
Authorization: Bearer <token></token>头中提取 Token,空或格式错误直接返回 401 - 用
JWT::decode()校验签名、过期、算法,捕获ExpiredException、SignatureInvalidException等异常 - 校验通过后,把解码后的 payload(含 uid、role)存入请求上下文(如
$request->getAttribute('user')),后续控制器可直接使用 - 可扩展:检查
nbf(生效时间)、aud(受众)增强安全性
权限控制:按 scope 或 role 拦截操作
Token 中携带的权限信息,应在具体接口中做细粒度判断,而非仅靠“有 token 就放行”:
- 例如管理类接口要求
scope === 'admin',订单接口只允许uid匹配当前用户 ID - 避免在每个控制器重复写校验逻辑,封装成简单函数如
requireScope($request, 'write') - 敏感操作(如删除、支付)建议二次确认或短期 Token(如用
exp=300),降低风险
不复杂但容易忽略:Token 必须通过 HTTPS 传输,前端存储用 httpOnly Cookie(防 XSS)或内存变量(防 XSS + CSRF 组合攻击),禁用 localStorage 存储长期 Token。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











