Laravel

Laravel Sanctum 与 Postman 之类测试工具的坑

2914
4
2020-10-12

最近在筹备自己写个博客,是的,造轮子。主要是我自己缺一个全栈的中型项目写在简历上,所以打算造个轮子
翻了翻 Laravel 的文档,准备用新出的 Sanctum SPA认证 来解决管理后台的登录问题

登录失败

因为后台还没撸出来,所以先用 Postman 来测试接口。跟着官方文档,直到 GET /sanctum/csrf-cookie 这一步都没有问题,能够正常接收到 XSRF-TOKENblog_session 两个 cookie
但下一步登录时就出问题了,POST /user/login 能正常通过 Auth::attempt,但却没有返回 remember_xxx cookie
继续去访问被 auth:sanctum 中间件保护的接口时也会报错,说明登录是没有成功的

各种百思不得其解、搜索未果。最后去读源码:
vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStateful.php:22
发现当 static::fromFrontend 返回 false 时不会加载 cookie、session 相关的中间件,自然也就无法发送登陆后的 cookie 了
跟踪进到这个方法里,发现它是有判断请求头里的referer字段的😑 正常前端请求会自带这个字段,可 Postman 不会啊,怪不得死活过不去

读不到 CSRF Token

手动给请求头加上这个字段,再次请求登录接口,报 419 Page Expired。估计是 csrf token 过期了,再次 GET /sanctum/csrf-cookie 然后登录,还是 419,这就怪了
继续翻文档,原来是请求头还需要一个 X-XSRF-token 字段,其值就是上面返回的 XSRF-TOKEN 的值。Axios 之类的库会自动处理好,但 Postman 依然不会,手动复制粘贴之

解密异常

再次请求登录,这次报错 DecryptException - The payload is invalid,解密异常?那不是 csrf token 就是 cookie 的问题了
这次解决起来顺利许多,一搜就搜到了 Laravel DecryptException - The payload is invalid
将请求头 X-XSRF-token 值内的 %3D 替换为 = 即可

唉,就这都能折腾一晚上,老了,被自己蠢哭

昵称
邮箱
网址
prin的头像 2021-05-11 02:51

刚刚我用 Postman + Laravel Sanctum,也碰到了 419 PAGE EXPIRED 的问题,Google 到这里,发现还真是把 %3D 替换成 = 就好了……

惠州注册公司的头像 2020-11-03 15:19

又发现一个好站,收藏了~以后会经常光顾的 (。•ˇ‸ˇ•。)

nsse的头像 2020-10-31 14:36
nsse

👍👍

ns的头像 2020-10-31 14:35
ns

👍