CORS
CORS 帮助你保护应用免受浏览器环境中由脚本触发的恶意请求。
例如,如果从一个不同的域向你的服务器发送了 AJAX 或 fetch 请求,浏览器会拦截该请求并抛出 CORS 错误,并期望你实现一项 CORS 策略(如果你认为应该允许该请求)。
在 AdonisJS 中,你可以使用 @adonisjs/cors 包实现 CORS 策略。该包附带一个 HTTP 中间件,它会拦截传入的请求,并以正确的 CORS 头进行响应。
安装
使用以下命令安装并配置该包:
node ace add @adonisjs/cors
-
使用检测到的包管理器安装
@adonisjs/cors包。 -
在
adonisrc.ts文件中注册以下服务提供者。{providers: [// ...other providers() => import('@adonisjs/cors/cors_provider')]} -
创建
config/cors.ts文件。该文件包含 CORS 的配置设置。 -
在
start/kernel.ts文件中注册以下中间件。server.use([() => import('@adonisjs/cors/cors_middleware')])
配置
CORS 中间件的配置存储在 config/cors.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以拒绝请求当前的源。{origin: true}你可以指定一个硬编码的源列表来允许一组域名。
{origin: ['adonisjs.com']}使用通配符表达式
*来允许所有源。阅读 MDN 文档 以了解通配符表达式的工作方式。当
credentials属性设置为true时,我们会自动让通配符表达式表现得像boolean (true)。{origin: '*'}你可以在 HTTP 请求期间使用函数计算
origin值。例如:{origin: (requestOrigin, ctx) => {return true}} -
methods
-
methods属性控制在预检(preflight)请求期间允许的方法。Access-Control-Request-Method 头的值会针对允许的方法进行校验。{methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE']} -
headers
-
headers属性控制在预检(preflight)请求期间允许的请求头。Access-Control-Request-Headers 头的值会针对 headers 属性进行校验。将值设置为
true将允许所有请求头。而将值设置为false将拒绝所有请求头。{headers: true}你可以通过定义字符串数组来指定允许的一组请求头。
{headers: ['Content-Type','Accept','Cookie']}你可以在 HTTP 请求期间使用函数计算
headers配置值。例如:{headers: (requestHeaders, ctx) => {return true}} -
exposeHeaders
-
exposeHeaders属性控制在预检(preflight)请求期间通过 Access-Control-Expose-Headers 头暴露的响应头。{exposeHeaders: ['cache-control','content-language','content-type','expires','last-modified','pragma',]} -
credentials
-
credentials属性控制在预检(preflight)请求期间是否设置 Access-Control-Allow-Credentials 头。{credentials: true} -
maxAge
-
maxAge属性控制 Access-Control-Max-Age 响应头。该值以秒为单位。- 将值设置为
null将不会设置该头。 - 而将值设置为
-1会设置该头但禁用缓存。
{maxAge: 90} - 将值设置为
调试 CORS 错误
调试 CORS 问题是一段充满挑战的体验。然而,除了理解 CORS 规则并调试响应头来确保所有内容就位之外,别无捷径。
以下是一些你可能想阅读以更好地理解 CORS 工作原理的文章链接。