【发布时间】:2020-05-08 10:33:01
【问题描述】:
概述
我有一个本地托管在 http://tenant.api.hydrogen.local 的 Laravel 驱动的 api 和一个在 http://localhost:8100 上提供的 Angular 9.2 SPA。我最近安装了 Laravel Sanctum 进行身份验证,并按照docs 中列出的 SPA 说明进行操作,但 CSRF 令牌未附加到来自 SPA 的请求,因此我收到 CSRF 令牌不匹配错误。
按照指示,我在随后尝试登录之前先拨打了//abc.api.hydrogen.local/sanctum/csrf:
this.http.get('sanctum/csrf-cookie')
.pipe(
switchMap(result => this.http.post('auth/login', {'email': email, 'password': password}))
);
注意:我有一个拦截器,它在请求 url 前面加上 api url '//abc.api.hydrogen.local/' 例如'sanctum/csrf-cookie' 将变为 '//abc.api.hydrogen.local/sanctum/csrf-cookie'
来自 sanctum/csrf-cookie 的响应与预期的标头一起返回:
Access-Control-Allow-Credentials: true
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ilc3UkRLR1BSZ29TWVh3ZWZEQ3Y4aGc9PSIsInZhbHVlIjoiRUZBZXNFWTlZbWo5QWhIeWsrRmpjNUZVWkExSGtaT1hzUTVnSXpoaGQ4c3dFc2VLNjZsUHlUVWFmbG1uVVdKZSIsIm1hYyI6ImU1ZTAxNGFmMjAwNWRiMDhiODFjMGZhYTljYmU1NmRjYTUzYTNmNDJjNWM3YmQyM2FkY2I2OGYwNjYzNGU2MjkifQ%3D%3D; expires=Thu, 30-Apr-2020 13:35:06 GMT; Max-Age=7200; path=/; domain=localhost
Access-Control-Allow-Origin: http://localhost:8100
但是,当我查看浏览器控制台时,我在 storage > cookies 中看不到任何设置。此外,在随后的“login/”调用中没有附加任何 cookie,并且我收到 CSRF 令牌不匹配错误。
我已经阅读了许多详细描述类似问题的帖子,并实施了他们的建议和配置,包括以下内容:
Laravel API
- 在 .env 中我设置了 SESSION_DRIVER=cookie 和 SESSION_DOMAIN=localhost:8100
- 在 config/sanctum 中,我已将 localhost:8100 添加到有状态域中
- 在 config/cors 中,我设置了 supports_credentials = true 并允许所有路径、标题和来源(使用 '*' 值)
角度 SPA
- 我已经实现了一个全局拦截器,它将 withCredentials = true 设置为所有请求
- 我已确保我的 api 调用使用 //abc.api.hydrogen.com/ 而不是 http://abc.api.hydrogen.com/
- 我还尝试使用拦截器将 X-XSRF-TOKEN 标头设置为推荐的 here 但提取的令牌为空,因为它们尚未在浏览器中设置
【问题讨论】:
-
我也面临同样的问题。我认为问题是 XSRF-TOKEN cookie 没有在浏览器中设置,即使 cookie 存在于响应中。因此登录请求失败,因为该请求没有发送 XSRF-TOKEN。完成
sanctum/csrf-cookie请求后,能否检查应用程序中的 cookie?
标签: angular laravel laravel-sanctum