实现 php 应用单点登录需采用 JWT 机制,首先通过 firebase/php-jwt 库生成含用户信息的 Token;其次在各系统配置 中间件 校验请求中的 JWT 签名与有效期;再通过统一认证服务器 跨域 签发和验证 token,实现多系统一次登录;最后结合access_token 与 refresh_token 机制,在保障安全的同时提升用户体验。

如果您正在开发多个 PHP 应用并希望用户只需登录一次即可访问所有系统,则需要实现单点登录(SSO)机制。JWT(jsON Web Token)是一种广泛采用的无状态身份验证方案,适用于 分布式 系统中的身份传递与验证。以下是基于 JWT 在 PHP 中实现单点登录的具体实践步骤:
一、使用 JWT 生成令牌
在用户成功登录后,服务端应生成一个 JWT 令牌并返回给客户端。该令牌包含用户身份信息及签名,确保其不可篡改。
1、安装官方推荐的 JWT 库,例如通过 composer 引入firebase/php-jwt:composer require firebase/php-jwt。
2、在登录验证通过后,定义令牌的负载数据,包括用户 ID、用户名、过期时间等。
立即学习“PHP 免费学习笔记(深入)”;
3、使用密钥和指定 算法 (如 HS256)调用 JWT 编码 方法生成 token字符串。
4、将生成的 token 作为响应的一部分返回给 前端,通常放在 Authorization 头或响应体中。
二、配置中间件验证 JWT
每个受保护的 接口 都需要验证请求中携带的 JWT 是否合法。可以通过创建一个中间件来统一处理认证逻辑。
1、从 http 请求头中提取 Authorization 字段,格式通常为Bearer <token>。
2、使用相同的密钥和算法对 token 进行解码和验证,确认签名有效且未过期。
3、若验证失败,立即中断请求并返回 401 Unauthorized状态码。
4、若验证成功,将用户信息附加到请求 对象 中,供后续业务逻辑使用。
三、跨域 共享 JWT 实现单点登录
当多个子系统部署在不同域名下时,需通过统一的身份认证中心发放和校验 JWT,以实现跨域单点登录。
1、设立独立的认证服务器(如 sso.example.com),负责用户登录与 token 签发。
2、各业务系统在检测到未登录时,重定向至认证服务器进行身份验证。
3、认证成功后,认证服务器生成 JWT 并重定向回原系统,附带 token 参数。
4、各业务系统使用相同的密钥和服务规则验证 JWT,完成用户身份识别。
四、设置 JWT 刷新机制
为了兼顾安全性与用户体验,应引入短期有效的访问令牌和长期有效的刷新令牌组合机制。
1、登录时同时生成access_token 和 refresh_token,前者用于接口调用,后者用于获取新 token。
2、当 access_token 即将过期时,客户端可携带 refresh_token 请求新的 access_token。
3、服务端需存储 refresh_token 的状态或 黑名单,防止重复使用或被盗用。
4、每次使用 refresh_token 获取新 token 后,应使其失效,并生成新的 refresh_token。


