与Sanctum和Postman有关的SPA身份验证问题

iaqfqrcu  于 2023-10-18  发布在  Postman
关注(0)|答案(2)|浏览(228)

我目前正在尝试使用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。
任何帮助,甚至是关于检查的想法都会非常感谢,因为我不确定从这里做什么,除了花一天时间深入挖掘请求守卫对象及其示例化!
谢谢.

vxf3dgd4

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

oxalkeyp

oxalkeyp2#

这个问题已经解决了,原因是Postman在登录后只将“XSRF-TOKEN”和“laravel_session”cookie保存到“test”子域(登录URL使用此子域),因此在尝试访问受“auth:sanctum”保护的路由时没有将它们传递到“API”子域。通过Postman中的“管理Cookie”菜单将相同的Cookie添加到“API”子域,现在可以按预期访问路由。

相关问题