【问题标题】:Can I set a dynamic cors policy which only allows specific origins to pass cookies (Node.js)?我可以设置仅允许特定来源传递 cookie (Node.js) 的动态 cors 策略吗?
【发布时间】:2020-05-22 01:31:21
【问题描述】:

上下文

我有一个包含两种客户端的快速服务器。

  1. 我的应用程序(React + graphql):我已经为这个客户端启用了凭据:app.use(cors({ credentials: true, origin: "http://localhost:3000" })); 我已经设置了这个,以便我可以从我的 gql 客户端接收与身份验证相关的 cookie。

  2. 第三方服务(通过我提供的 http 客户端)。这些请求可以来自任意数量的来源。

我不能对原点 (cors({origin: *})) 使用通配符运算符,因为这将允许任何网站使用我的用户的身份验证 cookie。但是,如果我不通过通配符运算符,则第三方客户端无法发出请求。

我已尝试在特定路由上启用通配符,但未成功。

问题

我可以为不同的来源设置不同的 cors 政策吗?

【问题讨论】:

  • “反应随机来源的应用程序”?你想在这里启用什么?您是否提供许多其他网站(您不知道)会使用的服务?如果它们是您自己的网站,您不会知道来源吗?
  • 我的服务器为仪表板(我的应用程序)供电。我还编写了一个客户端,允许第三方从他们自己的 React 应用程序调用我的服务。 @jfriend00
  • 这些凭据是什么?我想知道您是否可以通过其他方式传递它们?
  • @jfriend00 我的理解是我的应用程序的来源需要传递credentials: true,以便它可以发送cookie。由于显而易见的原因,我无法将此来源设置为通配符。当上述策略到位时,当我尝试从模拟第三方反应应用程序发出请求时,会引发我遇到的错误。在文档中找不到解决方案

标签: node.js express cors


【解决方案1】:

你有几个选择。

  1. 您可以设置一个动态 cors 处理程序,它允许在不使用 * 的情况下允许来源。
  2. 您可以从 cookie 中获取所需的任何内容并以其他方式传递(例如,作为查询参数)。

您可以编写一个程序控制的 cors 处理程序,它可以允许一个域、一些域、所有域,但是您编写代码。

这是一个允许所有域不使用 *:

var corsOptions = {
  origin: function (origin, callback) {
    console.log(`Origin ${origin} is being granted CORS access`);
    callback(null, true)
  }
}

app.use(cors(corsOptions));

您也不必在全局范围内应用它。您可以将其仅应用于某些路由或仅应用于某些路由器。

此处的示例:CORS 模块文档中的https://www.npmjs.com/package/cors

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 2019-03-30
    • 2020-06-06
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2015-04-23
    • 2021-11-03
    • 2021-12-24
    相关资源
    最近更新 更多