PHP 如何做 JWT
生活里我们逛电商、刷短视频,登录账号时总需要“身份验证”——怎么确认是你本人在操作,而不是别人乱登?这时候就会用到一种叫JWT的工具,它就像一张带防伪的电子通行证,能证明你是你。很多用PHP做网站、小程序的朋友,常会问:PHP怎么实现JWT?今天就用大白话给大家讲明白,还附上手把手的简单例子,哪怕是刚接触PHP的新手也能看懂。
先搞懂JWT的核心:别记术语,就当它是“加密小票”
先别纠结“什么是JWT”,你就把它当成超市的“积分小票”:小票上会印你的会员号(对应JWT里的“公开信息”),还有超市偷偷加的防伪码(对应JWT里的“加密签名”),这样既方便收银系统快速读你的会员号,又不怕别人偷偷改你的积分。

JWT在网站里的作用也是一样:用户登录后,PHP生成这张“加密小票”,发给前端;之后用户每次点“我的订单”“修改资料”,前端就把这张小票发给PHP,PHP一看“防伪码没被改、会员号是对的”,就允许操作,不用每次都让你输账号密码,既方便又安全。
用PHP实现JWT:分3步,跟搭积木一样简单
PHP本身不会自带生成JWT的功能,我们用现成的小工具(叫“composer包”,就像现成的积木块)来做,不用自己从零写复杂代码,新手也能快速上手。
第一步:先准备好“积木工具”
先打开电脑里的PHP代码编辑器(比如VS Code),如果还没装composer(PHP常用的工具包管理器),可以搜“composer安装”按提示装,它能帮我们快速下载JWT工具。
打开你的项目文件夹,在终端里输一行命令:composer require firebase/php-jwt,等几秒钟,工具就自动装好了——这就像你买好了搭积木需要的JWT块。
第二步:生成JWT“加密小票”(用户登录时用)
用户输对账号密码后,PHP就可以生成这张小票了。我们先把代码拆成大白话,不用背语法:
首先,定义一个只有你知道的“防伪密码”(就像超市只有自己知道的防伪专用章,绝对不能泄露给别人),比如$key = 'woaini123456';;
然后,填小票上的公开信息,比如用户ID、名字,还可以加个“过期时间”——比如1小时后这张小票就作废,防止别人偷拿用,代码里就是$payload = ['user_id' => 123, 'username' => '小明', 'exp' => time() + 3600];;
最后,用刚才装的工具把信息和防伪密码加密,生成JWT小票:$jwt = JWT::encode($payload, $key, 'HS256');,这样就得到了一串像乱码但有规则的字符串,发给前端存好就行。
第三步:验证JWT“小票”(用户操作时用)
用户下次要改资料,前端会把刚才存的JWT小票发给PHP,PHP需要先查这张票是不是真的、有没有过期:
先把刚才的“防伪密码”拿回来,再把小票拆成信息和防伪码;
首先看时间:如果现在比“过期时间”晚,直接拒绝;
再核对防伪码:用小票里的公开信息,加上你的防伪密码,重新生成一个新的防伪码,和小票里的防伪码对比——不一样就说明票被改了,直接拒绝;
如果都对,就拿出小票里的用户ID,知道是小明在操作,允许他修改资料,整个过程不用再让小明输账号密码。
新手要注意的2个坑,别踩
很多人第一次做JWT时会踩这两个小坑:
一是“防伪密码别写死在代码里,要存在配置文件或环境变量里”——就像超市的防伪章要锁在保险柜,不能随便放在收银台,不然别人拿到就能伪造你的小票;
二是“过期时间别设太长,也别太短”——设1小时刚好,既不会让用户频繁登录,也不怕小票丢了被人乱用。
其实JWT的本质就是“给用户的身份信息加个只有自己能解开的防伪标签”,用PHP实现也只是把这个逻辑用现成工具写出来,不用纠结复杂的加密算法,跟着步骤做就能用。