Skip to content

CORS

CORS 帮助您保护应用程序免受浏览器环境中通过脚本触发的恶意请求。

例如,如果从不同域名向您的服务器发送 AJAX 或 fetch 请求,浏览器会使用 CORS 错误阻止该请求,并期望您实现 CORS 策略(如果您认为应该允许该请求)。

在 AdonisJS 中,您可以使用 @adonisjs/cors 包来实现 CORS 策略。该包附带一个 HTTP 中间件,用于拦截传入请求并以正确的 CORS 头进行响应。

安装

使用以下命令安装和配置包:

sh
node ace add @adonisjs/cors

:::disclosure

  1. 使用检测到的包管理器安装 @adonisjs/cors 包。

  2. adonisrc.ts 文件中注册以下服务提供器。

    ts
    {
      providers: [
        // ...其他提供器
        () => import('@adonisjs/cors/cors_provider')
      ]
    }
  3. 创建 config/cors.ts 文件。该文件包含 CORS 的配置设置。

  4. start/kernel.ts 文件中注册以下中间件。

    ts
    server.use([
      () => import('@adonisjs/cors/cors_middleware')
    ])

:::

配置

CORS 中间件的配置存储在 config/cors.ts 文件中。

ts
import { defineConfig } from '@adonisjs/cors'

const corsConfig = defineConfig({
  enabled: true,
  origin: true,
  methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE'],
  headers: true,
  exposeHeaders: [],
  credentials: true,
  maxAge: 90,
})

export default corsConfig

enabled

临时打开或关闭中间件,无需从中间件栈中移除它。

origin

origin 属性控制 Access-Control-Allow-Origin 头的值。

您可以将值设置为 true 以允许请求的当前来源,或设置为 false 以拒绝请求的当前来源。

ts
{
  origin: true
}

您可以指定硬编码的来源列表,以允许域名数组。

ts
{
  origin: ['adonisjs.com']
}

使用通配符表达式 * 允许所有来源。阅读 MDN 文档以了解通配符表达式的工作原理。

credentials 属性设置为 true 时,我们会自动使通配符表达式的行为类似于 boolean (true)

ts
{
  origin: '*'
}

您可以在 HTTP 请求期间使用函数计算 origin 值。例如:

ts
{
  origin: (requestOrigin, ctx) => {
    return true
  }
}

methods

methods 属性控制预检请求期间允许的方法。Access-Control-Request-Method 头的值会与允许的方法进行检查。

sh
{
  methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE']
}

headers

headers 属性控制预检请求期间允许的请求头。Access-Control-Request-Headers 头的值会与 headers 属性进行检查。

将值设置为 true 将允许所有头。将值设置为 false 将拒绝所有头。

ts
{
  headers: true
}

您可以通过将头定义为字符串数组来指定允许的头列表。

ts
{
  headers: [
    'Content-Type',
    'Accept',
    'Cookie'
  ]
}

您可以在 HTTP 请求期间使用函数计算 headers 配置值。例如:

ts
{
  headers: (requestHeaders, ctx) => {
    return true
  }
}

exposeHeaders

exposeHeaders 属性控制在预检请求期间通过 Access-Control-Expose-Headers 头暴露的头。

ts
{
  exposeHeaders: [
    'cache-control',
    'content-language',
    'content-type',
    'expires',
    'last-modified',
    'pragma',
  ]
}

credentials

credentials 属性控制是否在预检请求期间设置 Access-Control-Allow-Credentials 头。

ts
{
  credentials: true
}

maxAge

maxAge 属性控制 Access-Control-Max-Age 响应头。值以秒为单位。

  • 将值设置为 null 将不设置该头。
  • 将其设置为 -1 会设置该头但禁用缓存。
ts
{
  maxAge: 90
}

调试 CORS 错误

调试 CORS 问题是一个具有挑战性的体验。然而,除了理解 CORS 规则并调试响应头以确保一切就绪之外,没有其他捷径。

以下是一些文章链接,您可以阅读以更好地了解 CORS 的工作原理。