我目前正在尝试使用Laravel 8.19.0和Postman 7.36.1测试SPA,但我一直从一个由“auth:sanctum”保护的路由获得“未经身份验证”的响应,即使我已经正确登录。
据我所知,我已经完全遵循了https://laravel.com/docs/8.x/sanctum的文档,以便将Sanctum设置为用于SPA,所以我做了以下工作:
- 安装圣所。
- 发布了圣所配置。
- 执行迁移。
- 包括EnsureFrontendRequestsAreStateful中间件和'
EnsureFrontendRequestsAreStateful::class
'到Http内核。 - 在Sanctum配置文件的“stateful domains”选项中添加了我的本地域(相同的顶级域,但一个是“test”子域,另一个是“API”)。
- 将cors配置中的“supports_credentials”选项设置为“true”。
- 设置我的顶级域,在会话配置中的“domain”选项中以“.”为前缀。
然后,我使用https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/的指南设置了Postman,因此我编写了一个脚本来从“/sanctum/csrf-cookie”获取CSRF令牌,然后使用该令牌作为请求头中“X-XSRF-TOKEN”的值,我可以成功登录。然而,当我试图访问一个由“auth:sanctum”守卫保护的路由时,即使在请求报头中设置了加密器和“X-XSRF-TOKEN”,我也无法访问该路由。
调试后,我可以看到$this->auth->guard($guard)->check()
在authenticate($request, array $guards)
方法中返回false,其中$guard = "sanctum"
在 \vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php 第63行,因为$this->user()
对于 Illuminate\Auth\RequestGuard 示例为null。
任何帮助,甚至是关于检查的想法都会非常感谢,因为我不确定从这里做什么,除了花一天时间深入挖掘请求守卫对象及其示例化!
谢谢.
2条答案
按热度按时间vxf3dgd41#
很多人在使用Postman和Sanctum SPA认证时看到的问题是,你只需要在请求中添加一个额外的头,这可以是“Referrer”或“Origin”,并且值必须与sanctum.php配置文件中设置的域相匹配。例如localhost或mysite.test等。
在fromFrontEnd()方法中的vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStatefull.php可以看到这个要求。Laravel V8.x和Laravel V7.x
oxalkeyp2#
这个问题已经解决了,原因是Postman在登录后只将“XSRF-TOKEN”和“laravel_session”cookie保存到“test”子域(登录URL使用此子域),因此在尝试访问受“auth:sanctum”保护的路由时没有将它们传递到“API”子域。通过Postman中的“管理Cookie”菜单将相同的Cookie添加到“API”子域,现在可以按预期访问路由。