2

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

 2 years ago
source link: https://www.mokeyjay.com/archives/2852
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Laravel

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

最近在筹备自己写个博客,是的,造轮子。主要是我自己缺一个全栈的中型项目写在简历上,所以打算造个轮子
翻了翻 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 替换为 = 即可

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

本站文章除注明转载外,均为原创文章。如需转载请注明出处:https://www.mokeyjay.com/archives/2852

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK