Sanctum 和 Postman 的 SPA 身份验证问题

Posted

技术标签:

【中文标题】Sanctum 和 Postman 的 SPA 身份验证问题【英文标题】:SPA Authentication Issues with Sanctum and Postman 【发布时间】:2021-04-05 09:35:45 【问题描述】:

我目前正在尝试使用 Laravel 8.19.0 和 Postman 7.36.1 测试 SPA,但我不断从由“auth:sanctum”保护的路线收到“未经身份验证”的响应,即使我已正确登录.

据我所知,我已完全按照https://laravel.com/docs/8.x/sanctum 的文档进行操作 为了将 Sanctum 设置为用于 SPA,所以我做了以下操作:

安装 Sanctum。 发布了 Sanctum 配置。 执行了迁移。 将 EnsureFrontendRequestsAreStateful 中间件和“EnsureFrontendRequestsAreStateful::class”包含到 Http 内核中。 将我的本地域(相同的***域,但 1 个带有“test”子域,另一个带有“api”)添加到 Sanctum 配置文件中的“有状态域”选项。 将 cors 配置中的“supports_credentials”选项设置为“true”。 设置我的***域,以“.”为前缀对于会话配置中的“域”选项。

然后,我使用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 em> 在第 63 行,因为对于 Illuminate\Auth\RequestGuard 实例,$this->user() 为空。

任何关于检查的帮助甚至想法都将不胜感激,因为我不确定从这里做什么,没有花一天时间深入研究请求保护对象及其实例!

谢谢。

【问题讨论】:

【参考方案1】:

很多人在使用 Postman 和 Sanctum SPA 身份验证时遇到的问题是,您只需要在请求中添加一个额外的标头,这可以是“Referrer”或“Origin”,并且该值必须与设置的域匹配sanctum.php 配置文件。例如localhost 或 mysite.test 等。

vendor/laravel/sanctum/src/Http/Middleware/EnsureFrontendRequestsAreStatefull.php 在 fromFrontEnd() 方法中可以看到这个需求。 Laravel V8.x,我也相信 Laravel V7.x

【讨论】:

就是这样。如果没有 Referer 标头,Sanctum 将无法完全验证。【参考方案2】:

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

【讨论】:

我也有同样的问题,我的API域是api.example.test,我的SPA是example.test。任何受中间件 auth:sanctum 保护的东西都会在 POSTMAN 中返回“未经身份验证”。如果我通过我的 SPA 拨打电话,它工作得很好。不知道为什么。 PS:我关注了Alex(Codecourse)前段时间发表的文章:blog.codecourse.com/laravel-sanctum-airlock-with-postman

以上是关于Sanctum 和 Postman 的 SPA 身份验证问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Sanctum Token API 身份验证在 Postman 中不起作用

用于非 SPA 的 Laravel Sanctum API 令牌

如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证

Laravel Sanctum 无法使用 Postman 登录

带有 Sanctum 身份验证的 Laravel 8 (Reactjs SPA)

带有 Vuejs 的 Laravel 7.x Sanctum (SPA) 总是返回 401 Unauthorized