新闻详情

新闻详情

首页 / 资讯中心 / 详情

PHP中四种主流Token实现方案

发布时间:2026/9/28 5:00:03来源:尧图网络
PHP中四种主流Token实现方案
Token 机制广泛应用于身份验证、防止 CSRF 攻击、接口鉴权等场景。在 PHP 中主流实现方案均围绕生成唯一标识 存储验证 有效期控制三大核心思路展开。本文梳理了 4 种主流实现方式便于快速选型和实践。方案 1基于 Session 的 Token 实现核心原理利用 PHP 内置 Session 机制将 Token 存储在服务端 Session 中客户端仅保存 SessionID通常通过 Cookie。每次请求时服务端验证 Token 是否匹配。实现代码1234567891011121314151617181920212223242526272829303132333435363738394041424344?php// 初始化Sessionsession_start();/*** 生成并存储Token*/functiongenerateSessionToken() {$token bin2hex(random_bytes(16));$_SESSION[csrf_token] $token;$_SESSION[csrf_token_expire] time() 3600;// 1小时有效期return$token;}/*** 验证Session Token*/functionverifySessionToken($token) {if(!isset($_SESSION[csrf_token]) || !isset($_SESSION[csrf_token_expire])) {returnfalse;}if(time() $_SESSION[csrf_token_expire]) {unset($_SESSION[csrf_token],$_SESSION[csrf_token_expire]);returnfalse;}$isValid hash_equals($_SESSION[csrf_token],$token);if($isValid) {unset($_SESSION[csrf_token],$_SESSION[csrf_token_expire]);}return$isValid;}// 示例$token generateSessionToken();echoinput typehidden namecsrf_token value.$token.;if($_SERVER[REQUEST_METHOD] POST) {$clientToken$_POST[csrf_token] ??;if(verifySessionToken($clientToken)) {echoToken验证通过执行业务逻辑;}else{echoToken无效或已过期;}}?优缺点优点缺点实现简单依赖 PHP 原生 Session依赖 Cookie客户端禁用 Cookie 则失效Token 存储在服务端安全性高分布式部署需配置 Session 共享如 Redis支持服务端主动销毁 Token占用服务器内存Session 默认存储在文件/内存方案 2基于 JWTJSON Web Token的 Token 实现核心原理JWT 是一种无状态Token 方案由 Header、Payload、Signature 三部分组成。Token 存储于客户端如 LocalStorage/Cookie服务端仅通过签名校验其合法性和完整性。前置条件需安装 JWT 扩展推荐使用 firebase/php-jwt实现代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849?phprequirevendor/autoload.php;useFirebase\JWT\JWT;useFirebase\JWT\Key;$secretKeyyour_strong_secret_key;$algorithmHS256;/*** 生成JWT Token*/functiongenerateJwtToken($payload []) {global$secretKey,$algorithm;$defaultPayload [iat time(),exp time() 3600,];$payloadarray_merge($defaultPayload,$payload);returnJWT::encode($payload,$secretKey,$algorithm);}/*** 验证JWT Token*/functionverifyJwtToken($token) {global$secretKey,$algorithm;try{$decoded JWT::decode($token,newKey($secretKey,$algorithm));return(array)$decoded;}catch(Exception$e) {echoToken验证失败.$e-getMessage();returnfalse;}}// 示例$userPayload [uid 1001,usernametest_user];$jwtToken generateJwtToken($userPayload);echo生成的JWT Token.$jwtToken. ;$clientToken$_GET[token] ??;$decodedData verifyJwtToken($clientToken);if($decodedData) {echoToken验证通过用户ID.$decodedData[uid];}else{echoToken无效;}?优缺点优点缺点无状态分布式友好Token 无法主动销毁仅能等过期可用黑名单弥补支持跨域、跨平台负载信息 Base64 编码不可存储敏感数据传输体积小可自定义数据密钥泄露风险高需严格保管不依赖 Cookie兼容性好过期时间固定需重新签发才能调整方案 3基于 Redis 的 Token 实现核心原理Token 作为 Key用户信息/过期时间作为 Value 存储在 Redis。利用 Redis 过期键特性自动管理 Token 有效期验证时查询 Redis 是否存在该 Token 且未过期。前置条件需安装 PHP Redis 扩展并配置 Redis 连接。实现代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455?phpfunctioninitRedis() {$redisnewRedis();try{$redis-connect(127.0.0.1, 6379);// $redis-auth(your_redis_password);return$redis;}catch(Exception$e) {echoRedis连接失败.$e-getMessage();returnnull;}}functiongenerateRedisToken($uid,$expire 3600) {$redis initRedis();if(!$redis)returnfalse;$token md5($uid. time() . random_bytes(16));$tokenKeytoken:.$token;$redis-setex($tokenKey,$expire,$uid);return$token;}functionverifyRedisToken($token) {$redis initRedis();if(!$redis)returnfalse;$tokenKeytoken:.$token;$uid$redis-get($tokenKey);if($uid) {$redis-expire($tokenKey, 3600);// 滑动有效期return(int)$uid;}returnfalse;}functiondestroyRedisToken($token) {$redis initRedis();if(!$redis)returnfalse;$tokenKeytoken:.$token;return$redis-del($tokenKey) 0;}// 示例$token generateRedisToken(1001);echoRedis Token.$token.br;$clientToken$_POST[token] ??;$uid verifyRedisToken($clientToken);if($uid) {echoToken验证通过用户ID.$uid;}else{echoToken无效或已过期;}// destroyRedisToken($clientToken);?优缺点优点缺点支持分布式、集群部署依赖 Redis增加系统复杂度可主动销毁 Token安全性高Redis 性能或容灾需关注支持滑动有效期需处理 Redis 连接异常代码需容错不依赖 Cookie兼容性好性能略低于 Session/JWT需网络 IO方案 4基于数据库MySQL的 Token 实现核心原理将 Token、用户ID、创建/过期时间、状态等信息存储在 MySQL。验证时查询数据库检查 Token 是否存在、未过期且状态有效。数据库表结构1234567891011CREATETABLEuser_token (idint(11)NOTNULLAUTO_INCREMENT,uidint(11)NOTNULLCOMMENT用户ID,tokenvarchar(64)NOTNULLCOMMENT令牌值,create_timeint(11)NOTNULLCOMMENT创建时间时间戳,expire_timeint(11)NOTNULLCOMMENT过期时间时间戳,status tinyint(1)NOTNULLDEFAULT1 COMMENT1-有效 0-无效,PRIMARYKEY(id),UNIQUEKEYidx_token (token),KEYidx_uid (uid)) ENGINEInnoDBDEFAULTCHARSETutf8mb4 COMMENT用户令牌表;实现代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576?php$dbConfig [host127.0.0.1,userroot,passwordyour_db_password,dbnametest,charsetutf8mb4];functioninitDb() {global$dbConfig;try{$dsnmysql:host{$dbConfig[host]};dbname{$dbConfig[dbname]};charset{$dbConfig[charset]};$pdonewPDO($dsn,$dbConfig[user],$dbConfig[password]);$pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);return$pdo;}catch(PDOException$e) {echo数据库连接失败.$e-getMessage();returnnull;}}functiongenerateDbToken($uid,$expire 3600) {$pdo initDb();if(!$pdo)returnfalse;$token hash(sha256,$uid. time() . random_bytes(32));$createTime time();$expireTime$createTime$expire;$sqlINSERT INTO user_token (uid, token, create_time, expire_time, status) VALUES (:uid, :token, :create_time, :expire_time, 1);$stmt$pdo-prepare($sql);$stmt-bindParam(:uid,$uid, PDO::PARAM_INT);$stmt-bindParam(:token,$token, PDO::PARAM_STR);$stmt-bindParam(:create_time,$createTime, PDO::PARAM_INT);$stmt-bindParam(:expire_time,$expireTime, PDO::PARAM_INT);return$stmt-execute() ?$token: false;}functionverifyDbToken($token) {$pdo initDb();if(!$pdo)returnfalse;$now time();$sqlSELECT uid FROM user_token WHERE token :token AND status 1 AND expire_time :now LIMIT 1;$stmt$pdo-prepare($sql);$stmt-bindParam(:token,$token, PDO::PARAM_STR);$stmt-bindParam(:now,$now, PDO::PARAM_INT);$stmt-execute();$result$stmt-fetch(PDO::FETCH_ASSOC);if($result) {return(int)$result[uid];}returnfalse;}functiondestroyDbToken($token) {$pdo initDb();if(!$pdo)returnfalse;$sqlUPDATE user_token SET status 0 WHERE token :token;$stmt$pdo-prepare($sql);$stmt-bindParam(:token,$token, PDO::PARAM_STR);return$stmt-execute() $stmt-rowCount() 0;}// 示例$token generateDbToken(1001);echo数据库Token.$token.br;$clientToken$_SERVER[HTTP_TOKEN] ??;$uid verifyDbToken($clientToken);if($uid) {echoToken验证通过用户ID.$uid;}else{echoToken无效或已过期;}// destroyDbToken($clientToken);?优缺点优点缺点支持复杂 Token 管理如批量禁用、查询记录数据库 IO 性能低于 Redis/Session高并发下易成瓶颈数据持久化方便追溯需手动清理过期 Token表数据易膨胀可扩展字段便于审计分布式部署需考虑主从同步支持主动销毁 Token代码复杂度高需处理事务、异常等各方案对比汇总表对比维度Session TokenJWT TokenRedis Token数据库 Token存储位置服务端文件/内存客户端服务端Redis服务端MySQL状态特性有状态无状态有状态有状态分布式支持需 Session 共享天然支持Redis 集群主从同步/分库分表主动销毁支持不支持需黑名单支持支持性能高极高中低复杂度低中中高适用场景小型项目、CSRF 防护前后端分离、无状态服务中大型项目、分布式审计、复杂权限、低并发安全性高中高高总结与选型建议选型核心原则小型单节点项目优先选用 Session Token实现简单。前后端分离/跨域场景优先选用 JWT Token无状态易于扩展。中大型分布式项目优先选用 Redis Token性能与灵活性兼具。需审计/复杂管理场景可选 数据库 Token持久化与扩展性强。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Spark性能调优:深入理解persist与StorageLevel持久化机制 2026/9/28 7:01:03

Spark性能调优:深入理解persist与StorageLevel持久化机制

你有没有遇到过这种情况:同一个Spark任务,在测试环境跑得飞快,一上生产就慢到让人怀疑人生。排查了半天,发现某个stage的shuffle read反复出现,同一个RDD被从头算了一遍又一遍。问题大概率不在代码逻辑,而在…

阅读更多 →
Agent全栈开发从入门到实战:架构、工具链与工程化落地 2026/9/28 7:01:03

Agent全栈开发从入门到实战:架构、工具链与工程化落地

Agent开发这两年热度有多高,不用我多说了。打开任何一个技术社区,讨论Agent架构、Agent框架、Agent记忆机制的内容都在爆炸式增长。我大概从2024年开始正式做Agent相关项目,从最初的简单工具调用,到后来给客户落地完整的Agent系统…

阅读更多 →
Agent全栈开发避坑指南:从Prompt到部署的完整学习链路 2026/9/28 7:01:03

Agent全栈开发避坑指南:从Prompt到部署的完整学习链路

说实话,我第一次看到那个标题,B站最全最细的Agent全栈开发全套教程,748集,七天就能从小白到大神——第一反应是被营销话术震住了。但真正把课程目录拉出来、再按自己的节奏刷过一遍之后,我得收回一半偏见:这…

阅读更多 →
货拉拉营销广告大模型落地:Agent架构与文案生成实战 2026/9/28 7:01:03

货拉拉营销广告大模型落地:Agent架构与文案生成实战

1. 货拉拉营销广告场景下的大模型落地思路拆解货拉拉这类同城货运平台的营销广告,跟电商、游戏、在线教育完全不是一个玩法。电商可以靠海量SKU和用户行为做千人千面推荐,游戏可以靠买量素材快速迭代,但货拉拉的营销广告面对的是一个极度分散…

阅读更多 →
LVGL页面管理器:嵌入式GUI的内存生命周期控制方案 2026/9/28 7:01:03

LVGL页面管理器:嵌入式GUI的内存生命周期控制方案

1. 项目概述:为什么一个页面管理器能彻底改变嵌入式GUI开发体验LVGL 页面管理器(lv_scr_mgr)不是LVGL官方库自带的模块,而是由社区开发者在长期实战中提炼出的一套轻量级、可裁剪、强可控的界面生命周期管理方案。它解决的不是“能…

阅读更多 →
Agent Substrate(ax):Kubernetes原生Agent运行时底座 2026/9/28 7:00:56

Agent Substrate(ax):Kubernetes原生Agent运行时底座

1. “ax”不是缩写,而是Agent Substrate的代号:从命名逻辑看技术定位你第一次在GitHub或Kubernetes社区看到“ax”这个词,大概率会下意识把它当成某个缩写——比如“API eXtension”“Authentication eXchange”,甚至有人联想到直…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉