4.5. 登录 API 获取 JWT 令牌

本教程最新版为 9.x,当前版本已放弃维护,请阅读最新版本!

JWT

JWT 是 JSON Web Token 的缩写,是一个非常轻巧的规范,这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。

JWT 由头部(header)、载荷(payload)与签名(signature)组成,一个 JWT 类似下面这样:

{
    "typ":"JWT",
    "alg":"HS256"
}
{
    "iss":"http://larabbs.test",
    "iat":1515733500,
    "exp":1515737100,
    "nbf":1515733500,
    "jti":"c3U4VevxG2ZA1qhT",
    "sub":1,
    "prv":"23bd5c8949f600adb39e701c400872db7a5976f7"
}
signature
  • 头部申明了加密算法;
  • 载荷中有两个比较重要的数据,exp 是过期时间,sub 是 JWT 的主体,这里就是用户的 id;
  • 最后的 signature 是由服务器进行的签名,保证了 token 不被篡改。

JWT 最后是通过 Base64 编码的,也就是说,它可以被翻译回原来的样子来的。所以不要在 JWT 中存放一些敏感信息。

用户 id,过期时间等数据都保存在 Token...

本文章首发在 LearnKu.com 网站上。

为了保证课程的高品质,我们需要对课程进行收费。付费后 才能观看剩余内容。 购买

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:4
讨论数量: 110

jehaz007
jwt 刷新 token 具体方案,见答案
17 个点赞 | 32 个回复 | 问答 | 课程版本 5.5
holashatu
Auth::guard ('API')->attempt ($credentials)) 到底是什么?
9 个点赞 | 11 个回复 | 问答 | 课程版本 5.5
wangjiu
刷新 token 之后,旧的 token 会立即失效,应该如何解决?
3 个点赞 | 17 个回复 | 问答 | 课程版本 5.5
arfurs
dingo/API 的 api.auth 中间件对于不同用户表认证问题
3 个点赞 | 6 个回复 | 问答 | 课程版本 5.5
wangjiu
$this->response 是什么意思?
2 个点赞 | 10 个回复 | 问答 | 课程版本 5.5
qujsh
jwt 刷新过期了的问题
2 个点赞 | 8 个回复 | 问答 | 课程版本 5.7
AmberLavigne
JWT 如何被恶意劫持了怎么办?会出现这种情况吗?
2 个点赞 | 8 个回复 | 问答 | 课程版本 5.5
tooyond
我觉得把 Token 放在 Header 里更好一些
2 个点赞 | 7 个回复 | 分享 | 课程版本 5.5
szlwl01
token 原理是什么?
2 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
Cwift
Laravel 5.7 安装 JWT 失败?
2 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
易水
请问为什么.env 的配置过期时间无效,一直是 60 分钟?
1 个点赞 | 7 个回复 | 问答 | 课程版本 5.5
hehorange
JWT 跟 token 的区别?
1 个点赞 | 6 个回复 | 问答 | 课程版本 5.5
Wen369367988
jwt token 有效期
1 个点赞 | 5 个回复 | 问答 | 课程版本 5.5
北极冰
请问 token 的验证原理是什么呢?
1 个点赞 | 5 个回复 | 问答 | 课程版本 5.5
MaNiu
我在这节课里已经饶了一周了,求老师指点
1 个点赞 | 4 个回复 | 问答 | 课程版本 6.x
HugBoomsj
API 接口安全,防止抓包如何处理?
1 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
遗忘的时光
结尾多一个分号?
1 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
Rainbow9502
关于认证中间件指定配置为 API 而非 Web 的问题?
1 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
working
关于PHP-Open-Source-Saver/jwt-auth的问题
1 个点赞 | 2 个回复 | 问答 | 课程版本 9.x
采用手机验证码,无密码登录的问题
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.8
Narcissus
phpstorm dingo/API 没有代码提示
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
hustnzj
请问 api.auth 这个中间件在哪里使用了?
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
悲剧不上演
教程中换取 Token 的方式与 OAuth2.0 不一样?
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
williamQian
这种方式可以替代 Laravel 自带的 auth 用户认证么?
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
zhangpipi
JWT 这种验证机制的安全性有多强?
1 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
zssen
unique 规则不生效,其他的验证规则生效是什么问题?
0 个点赞 | 14 个回复 | 问答 | 课程版本 5.5
Aiden
laravel8使用jwt 登录成功返回的token 为true求解答
0 个点赞 | 8 个回复 | 问答 | 课程版本 8.x
logic
tinker 验证错误
0 个点赞 | 8 个回复 | 问答 | 课程版本 5.5
江渚之上
刷新和删除 token 报错?
0 个点赞 | 8 个回复 | 问答 | 课程版本 5.5
__K7__
密码验证用教程的一直验证不过
0 个点赞 | 7 个回复 | 问答 | 课程版本 5.5
Innocence6
Token Signature could not be verified?
0 个点赞 | 7 个回复 | 问答 | 课程版本 5.5
zhou0818
jwt-auth 如何设置,获取刷新 token 的过期时间?
0 个点赞 | 7 个回复 | 问答 | 课程版本 5.5
mingzheng
安装jwt-auth失败,提示版本冲突
0 个点赞 | 6 个回复 | 问答 | 课程版本 8.x
Mr0451
关于 jwt 刷新的疑惑
0 个点赞 | 5 个回复 | 问答 | 课程版本 5.5
战狼1991
手机登录提示 “用户名或密码错误”
0 个点赞 | 4 个回复 | 问答 | 课程版本 6.x
gyp719
token 生成失败,哪位大佬知道
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.8
W-W
Laravel5.8 安装 JWT-auth 失败?
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.7
walt-white
刷新 token 提示令牌已被列入黑名单列表
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.7
logic
The payload is invalid?
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
wangjiu
刷新 token 方法无法返回 Auth::guard ('API')->user () 当前用户吗?
0 个点赞 | 4 个回复 | 问答 | 课程版本 5.5
lafans
auth('api')->factory()->getTTL() * 60
0 个点赞 | 3 个回复 | 问答 | 课程版本 7.x
MaNiu
老师,求问下这节中提到的 dingoApi 和 fromUser 在哪用到了?
0 个点赞 | 3 个回复 | 问答 | 课程版本 6.x
wangxi
关于刷新 token 的问题
0 个点赞 | 3 个回复 | 问答 | 课程版本 6.x
ATYW
请教一下大家,服务端调用服务端 API 问题
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.8
Narcissus
不明白 token_type 等于 Bearer 的作用
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
阿伦
Auth 与 auth () 的区别?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
AllenBool
第三方登录修改后,操作 刷新 token 一直出现 500 报错?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
Ciroy
jwt 是否安全? 这个不是可以直接被解析出来么?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
czy2020
有人遇到这个问吗?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
xolee
删除 token 操作后,postman 提示 Could not get any response?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
Daemon
在 config/api.php,auth 中增加 JWT 相关的配置,作用是什么呢?
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
Kerr
安装 jwt-auth 出错,显示 PHP 的内存不足错误
0 个点赞 | 2 个回复 | 问答 | 课程版本 6.x
bing_
如何获取 Bearer {token} ?
0 个点赞 | 2 个回复 | 分享 | 课程版本 5.8
Soner
关于 use Auth 到底是引入的哪个?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.7
Sher
多个字段登录怎么解决,比如 email、phone、name 等
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
jaminchen
jwt 服务端真的不要保存么?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.7
阿伦
为什么教程和 JWT 的文档不一样?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
Zhangzhuow
用户可以多设备登录?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
xuecong
为什么登录完成后不直接返回用户个人信息?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
hanghang
设置 token 的过期日期为永久,报错?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
Pepsi丶
请问有人遇到过这个问题吗?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
heart_5653
如何查看源码?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
HugBoomsj
求助 Token has expired?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
Yang
过期时间为什么要设置成 TTL * 60 ?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
tommysong666
大家有没有遇到这个问题,是我少了哪个步骤吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 7.x
zjnn
如果我想修改JWT使用的users表 改为其他用户表可以吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 7.x
王子飞
如果普通表单登录后,又要调用api接口,如何获取JWT token
0 个点赞 | 1 个回复 | 问答 | 课程版本 7.x
夜带水果刀
4.5. 登录 API 获取 JWT 令牌:"Undefined variable: token",
0 个点赞 | 1 个回复 | 分享 | 课程版本 7.x
wonderfate
登录时,账号未注册返回 HTTP 状态码 422 是否合适
0 个点赞 | 1 个回复 | 问答 | 课程版本 6.x
战狼1991
登录提示 “用户名或密码错误”
0 个点赞 | 1 个回复 | 分享 | 课程版本 6.x
wongvio
无法生成 token 是为什么
0 个点赞 | 1 个回复 | 问答 | 课程版本 6.x
wali
刷新 Token 返回 400 错误
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.8
JHWu
对于 guards 问题,DingoApi 如何切换不同 guards
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
xingxiaoli
$credentials 数组的值可以自己随意添加吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.8
xingxiaoli
退出登录就是销毁 token 吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.7
xingxiaoli
token 不需要保存吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.7
yufatang
关于 bear basic
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
CaiBird008
JWTAuth::parseToken ( )->方法名 与 \Auth::guard ( 'API' )->方法名
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.7
taowendi
生成 token 报错
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.7
Innocence6
刷新 token 报 405?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
xuecong
刷新 token 和删除 token 路由是不是应该添加 api.auth 中间件?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
Luff
用户能互踢吗?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
MIYA28118
5.6.21 安装 JWT 报错了?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
sainmu
这篇贴出来的代码没有判断 openid 和 unionid,忘修正?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.5
wanyi
jwt-auth安装时的版本问题
0 个点赞 | 0 个回复 | 分享 | 课程版本 8.x
xiaoqiang1994
发送过期的token来执行删除方法会出错
0 个点赞 | 0 个回复 | 问答 | 课程版本 6.x
captainwong
Laraval8 + PHP8 需要安装 1.0.x-dev
0 个点赞 | 0 个回复 | 分享 | 课程版本 8.x
酱汁儿
关于不建议在注册日期声明中使用整数的解决办法
0 个点赞 | 0 个回复 | 分享 | 课程版本 8.x
pee2bee
生成的token,直接复制到postman报错
0 个点赞 | 0 个回复 | 分享 | 课程版本 6.x
phpervip
第三遍了,还是看不懂
0 个点赞 | 0 个回复 | 分享 | 课程版本 6.x
nielz
刷新 token,报 400 错误,怎么解决?
0 个点赞 | 0 个回复 | 问答 | 课程版本 6.x
zjnn
删除 token destroy 返回报错
0 个点赞 | 0 个回复 | 问答 | 课程版本 6.x
Jeffid
刷新和删除方法中 Auth 类使用时注意
0 个点赞 | 0 个回复 | 分享 | 课程版本 5.7