当前位置: 首页 > 知识库问答 >
问题:

无法使axios在跨域请求中包含来自cookie的CSRF令牌

赫连冠玉
2023-03-14

免责声明 - 我在stackoverflow上看了很多类似的问题。

我有一个后端正在运行”https://api.website.com“和一个运行在上的前端”https://admin.website.com“后端的CORS策略设置如下:

appCorsResourcePolicy = CorsResourcePolicy {
    corsOrigins        = Just (["http://localhost:8082", "https://admin.website.com"], True)
  , corsMethods        = ["OPTIONS", "GET", "PUT", "POST", "PATCH", "DELETE"]
  , corsRequestHeaders = ["Authorization", "Content-Type", "Cookie", "X-XSRF-TOKEN", "Origin", "X-Requested-With", "Accept",
                          "Accept-Language", "Content-Language"]
  , corsExposedHeaders = Just ["Set-Cookie", "X-XSRF-TOKEN"]
  , corsMaxAge         = Nothing
  , corsVaryOrigin     = True
  , corsRequireOrigin  = False
  , corsIgnoreFailures = False
}

在对“https://api.website.com”执行GET请求后,前端成功接收为域“api.website.com”设置的XSRF-TOKEN cookie(secure = false,httpOnly = false,sameSite = Lax)(我也尝试了SameSite = None,secure = true)。现在,在向“https://api.website.com”发出POST请求时,我无法使axios(或手动)将令牌从cookie添加到X-XSRF-TOKEN标头。以下是我尝试提出请求的方式:

declare module 'axios' {
  export interface AxiosRequestConfig {
    crossDomain?: boolean;
  }
}

const xsrfCookieName = 'XSRF-TOKEN'
const xsrfHeaderName = 'X-XSRF-TOKEN'

export const api = axios.create({
  baseURL: endpoint,
  timeout: 5000,
  xsrfCookieName,
  xsrfHeaderName,
  withCredentials: true,
  crossDomain: true
})

//...

export const postWarehouses = (warehouse: string) =>
  api
  .post('/admin/warehouses', warehouse, { withCredentials: true })

另外,我尝试从cookie手动添加标头:

function attachCsrfToken(request: AxiosRequestConfig) {
  const csrfToken =
    ['POST', 'PUT', 'PATCH'].includes(request.method ?? 'GET') &&
    document.cookie &&
    document.cookie.length
      ? document.cookie.match(new RegExp(`${xsrfCookieName}=([^;]+)`))
      : {} as RegExpMatchArray
  if (csrfToken && csrfToken.length > 1) {
    request.headers[xsrfHeaderName] = csrfToken[1] ?? ''
  }
  return request
}

api.interceptors.request.use(attachCsrfToken)

显然,前端只能读取域“https://admin.website.com”上的cookie。那我该怎么办呢?

我的后端设置了必要的标题:

access-control-allow-credentials: true
access-control-allow-origin: https://admin.website.com
access-control-expose-headers: Set-Cookie, X-XSRF-TOKEN

顺便说一句,我还控制XSRF-TOKEN cookie的创建。我宁愿避免“代理”解决方案 - 合并我的域。

共有1个答案

阴迪
2023-03-14

您是否尝试过测试该问题是否仍然存在于移动设备上?我有同样的问题,它基本上是开发和生产csrf令牌冲突,这个问题只针对我,而不是用户,我通过删除127.0.0.1、web.site和api.web.site的所有cookie来解决它

 类似资料:
  • 本文向大家介绍Django跨域请求CSRF的方法示例,包括了Django跨域请求CSRF的方法示例的使用技巧和注意事项,需要的朋友参考一下 web跨域请求 1.为什么要有跨域限制 举个例子: 1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。 2.用户浏览了恶意页面 http://evil.com。执行了页面中的

  • 问题内容: 我正在使用Axios从客户端向我的Express.js服务器发送请求。 我在客户端上设置了一个cookie,我想从所有Axios请求中读取该cookie,而无需手动将其手动添加到请求中。 这是我的客户端请求示例: 我试图通过在Express.js服务器中使用以下属性来访问标头或cookie: 他们两个都不包含任何cookie。我正在使用cookie解析器中间件: 如何使Axios自动在

  • 本文向大家介绍Angularjs之如何在跨域请求中传输Cookie的方法,包括了Angularjs之如何在跨域请求中传输Cookie的方法的使用技巧和注意事项,需要的朋友参考一下 一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可。 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 虽然已经处理了跨域请

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 中间件 csrf 用于为 Macaron 实例 生成和验证 CSRF 令牌。 GitHub API 文档 下载安装 go get github.com/go-macaron/csrf 使用示例 想要使用该中间件,您必须同时使用 session 中间件。 package main import ( "github.com/go-macaron/csrf" "github.com/go

  • vue 3.0 +axios 跨域情况下无法携带cookie cooKie 是本地写入缓存的 axios已设置withCredentials=true; 后端也加了 发起请求时 查看请求头还是没有set-cookie