Laravel Sanctum 与 Postman 之类测试工具的坑
最近在筹备自己写个博客,是的,造轮子。主要是我自己缺一个全栈的中型项目写在简历上,所以打算造个轮子
翻了翻 Laravel 的文档,准备用新出的 Sanctum SPA认证 来解决管理后台的登录问题
登录失败
因为后台还没撸出来,所以先用 Postman 来测试接口。跟着官方文档,直到 GET /sanctum/csrf-cookie
这一步都没有问题,能够正常接收到 XSRF-TOKEN
和 blog_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
替换为 =
即可
唉,就这都能折腾一晚上,老了,被自己蠢哭
刚刚我用 Postman + Laravel Sanctum,也碰到了 419 PAGE EXPIRED 的问题,Google 到这里,发现还真是把 %3D 替换成 = 就好了……
又发现一个好站,收藏了~以后会经常光顾的 (。•ˇ‸ˇ•。)
👍👍
👍