gpt4 book ai didi

angular - 未为使用 Laravel Sanctum 和 Angular 的跨域请求设置 CSRF Coo​​kie

转载 作者:行者123 更新时间:2023-12-03 19:13:04 24 4
gpt4 key购买 nike

概述

我在 http://tenant.api.hydrogen.local 本地托管了一个 Laravel 驱动的 api和 Angular 9.2 SPA 正在 http://localhost:8100 上提供服务.我最近安装了 Laravel Sanctum 进行身份验证,并按照 docs 中列出的 SPA 说明进行操作。但是 CSRF token 未附加到来自 SPA 的请求,因此我收到 CSRF token 不匹配错误。

按照指示,我首次调用 //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 的响应与预期的 header 一起返回:
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

但是,当我查看浏览器控制台时,在存储 > cookie 中没有看到任何设置。此外,后续对“login/”的调用没有附加 cookie,并且我收到了 CSRF token 不匹配错误。

我已经阅读了大量详细介绍类似问题的帖子,并实现了他们的建议和配置,包括以下内容:

Laravel API
  • 在 .env 中,我设置了 SESSION_DRIVER=cookie 和 SESSION_DOMAIN=localhost:8100
  • 在 config/sanctum 中,我已将 localhost:8100 添加到有状态域
  • 在 config/cors 中,我设置了 support_credentials = true 并允许所有路径、标题和来源(使用“*”值)

  • Angular SPA
  • 我已经实现了一个全局拦截器,将 withCredentials = true 设置为所有请求
  • 我确保我的 api 调用使用//abc.api.hydrogen.com/而不是 http://abc.api.hydrogen.com/
  • 我还尝试了一个拦截器来按照推荐的方式设置 X-XSRF-TOKEN header here但是提取的 token 为空,因为它们尚未在浏览器中设置
  • 最佳答案

    出现此问题是因为浏览器/angular 只会将 cookie 附加到与请求来自的域具有相同域的请求。

    为了在 localhost 上提供 angular 应用程序并且 Laravel 应用程序位于 abc.api.hydrogen.local 之类的域中的开发环境中解决此问题,我代理了来自 angular 应用程序的请求:

    首先确保您的请求是相对路由,例如我将调用更改为/api/sanctum/crsf,然后将其代理到 http://abc.api.hydrogen.local/sanctum/crsf

    然后创建代理配置proxy.conf.json在项目的根目录中:

    {
    "/api/*": {
    "target": "http://abc.api.hydrogen.local",
    "secure": false,
    "changeOrigin": true,
    "logLevel": "debug",
    "pathRewrite": {
    "^/api": ""
    }
    }
    }

    然后编辑 angular.json在服务时使用代理:
    "architect": {
    ...
    "serve": {
    ...
    "options": {
    ....
    "proxyConfig": "proxy.conf.json"
    }
    }
    }

    最后在您的 .env文件添加以下内容以确保 sanctum 将请求识别为来自第一方 SPA,并且浏览器能够读取 cookie 并将其附加到请求中。
    SANCTUM_STATEFUL_DOMAINS=localhost,.hydrogen.local
    SESSION_DRIVER=cookie
    SESSION_DOMAIN=localhost

    现在一切正常。

    关于angular - 未为使用 Laravel Sanctum 和 Angular 的跨域请求设置 CSRF Coo​​kie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535144/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com