Sanctum 和 Postman 的 SPA 身份验证问题
SPA Authentication Issues with Sanctum and Postman
我目前正在尝试使用 Laravel 8.19.0 和 Postman 7.36.1 测试 SPA,但我不断收到来自“auth:sanctum”保护的路由的“未验证”响应,尽管我已经正确登录了。
据我所知,我已完全按照 https://laravel.com/docs/8.x/sanctum 中的文档进行操作
为了将 Sanctum 设置为用于 SPA,所以我做了以下操作:
- 已安装 Sanctum。
- 发布了 Sanctum 配置。
- 执行了迁移。
- 在 Http 内核中包含了 EnsureFrontendRequestsAreStateful 中间件和“
EnsureFrontendRequestsAreStateful::class
”。
- 将我的本地域(相同的 top-level 域,但 1 个带有“测试”子域,另一个带有“api”)添加到 [=66= 中的“状态域”选项] 配置文件。
- 将 cors 配置中的“supports_credentials”选项设置为“true”。
- 设置我的顶级域名,前缀为“.”对于 session 配置中的“域”选项。
然后,我使用 https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/ 中的指南设置了 Postman
所以我编写了一个脚本来从“/sanctum/csrf-cookie”获取 CSRF 令牌,然后使用所述令牌作为请求中“X-XSRF-TOKEN”的值 header 并且我可以成功登录。但是,当我之后尝试访问一条由“auth:sanctum”守卫守卫的路线时,即使在中设置了引荐来源网址和 'X-XSRF-TOKEN'请求 header 我无法访问路由。
调试后,我可以看到 $this->auth->guard($guard)->check()
在 authenticate($request, array $guards)
方法中返回 false where $guard = "sanctum"
in \vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php 在第 63 行,因为 $this->user()
对于 Illuminate\Auth\RequestGuard 实例是空的。
任何关于要检查的事情的帮助甚至想法将不胜感激,因为我不确定从这里做什么,除了花一天时间深入研究请求守卫 object 及其实例化!
谢谢。
问题已得到解决,这是由于 Postman 在登录后仅将“XSRF-TOKEN”和“laravel_session”cookie 保存到“test”子域(登录 URL 使用这个子域),因此在尝试访问受“auth:sanctum”保护的路由时,不会将它们传递给“api”子域。通过 Postman 中的“管理 Cookie”菜单将相同的 cookie 添加到“api”子域,现在可以按预期访问该路由。
很多人在将 Postman 与 Sanctum SPA 身份验证结合使用时遇到的问题是,您只需在请求中添加一个额外的 header,这可以是“Referrer”或“Origin” " 并且该值必须与 sanctum.php 配置文件中设置的域相匹配。例如localhost 或 mysite.test 等
fromFrontEnd()方法中的vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStatefull.php就是可以看到这个需求的地方。 Laravel V8.x 我也相信 Laravel V7.x
我目前正在尝试使用 Laravel 8.19.0 和 Postman 7.36.1 测试 SPA,但我不断收到来自“auth:sanctum”保护的路由的“未验证”响应,尽管我已经正确登录了。
据我所知,我已完全按照 https://laravel.com/docs/8.x/sanctum 中的文档进行操作 为了将 Sanctum 设置为用于 SPA,所以我做了以下操作:
- 已安装 Sanctum。
- 发布了 Sanctum 配置。
- 执行了迁移。
- 在 Http 内核中包含了 EnsureFrontendRequestsAreStateful 中间件和“
EnsureFrontendRequestsAreStateful::class
”。 - 将我的本地域(相同的 top-level 域,但 1 个带有“测试”子域,另一个带有“api”)添加到 [=66= 中的“状态域”选项] 配置文件。
- 将 cors 配置中的“supports_credentials”选项设置为“true”。
- 设置我的顶级域名,前缀为“.”对于 session 配置中的“域”选项。
然后,我使用 https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/ 中的指南设置了 Postman 所以我编写了一个脚本来从“/sanctum/csrf-cookie”获取 CSRF 令牌,然后使用所述令牌作为请求中“X-XSRF-TOKEN”的值 header 并且我可以成功登录。但是,当我之后尝试访问一条由“auth:sanctum”守卫守卫的路线时,即使在中设置了引荐来源网址和 'X-XSRF-TOKEN'请求 header 我无法访问路由。
调试后,我可以看到 $this->auth->guard($guard)->check()
在 authenticate($request, array $guards)
方法中返回 false where $guard = "sanctum"
in \vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authenticate.php 在第 63 行,因为 $this->user()
对于 Illuminate\Auth\RequestGuard 实例是空的。
任何关于要检查的事情的帮助甚至想法将不胜感激,因为我不确定从这里做什么,除了花一天时间深入研究请求守卫 object 及其实例化!
谢谢。
问题已得到解决,这是由于 Postman 在登录后仅将“XSRF-TOKEN”和“laravel_session”cookie 保存到“test”子域(登录 URL 使用这个子域),因此在尝试访问受“auth:sanctum”保护的路由时,不会将它们传递给“api”子域。通过 Postman 中的“管理 Cookie”菜单将相同的 cookie 添加到“api”子域,现在可以按预期访问该路由。
很多人在将 Postman 与 Sanctum SPA 身份验证结合使用时遇到的问题是,您只需在请求中添加一个额外的 header,这可以是“Referrer”或“Origin” " 并且该值必须与 sanctum.php 配置文件中设置的域相匹配。例如localhost 或 mysite.test 等
fromFrontEnd()方法中的vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStatefull.php就是可以看到这个需求的地方。 Laravel V8.x 我也相信 Laravel V7.x