跨域资源共享 (CORS)
CORS 帮助你保护你的应用免受在浏览器环境中使用脚本触发的恶意请求。
例如,如果从不同的域向你的服务器发送 AJAX 或 fetch 请求,浏览器将使用 CORS 错误阻止该请求,并期望你在认为应该允许该请求时实现 CORS 策略。
在 AdonisJS 中,你可以使用 @adonisjs/cors 包实现 CORS 策略。该包附带一个 HTTP 中间件,用于拦截传入请求并使用正确的 CORS 标头进行响应。
安装
使用以下命令安装并配置该包:
node ace add @adonisjs/cors
-
使用检测到的包管理器安装
@adonisjs/cors包。 -
在
adonisrc.ts文件中注册以下服务提供者。{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属性控制在预检请求期间允许的方法。Access-Control-Request-Method 标头值将根据允许的方法进行检查。{methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE']} -
headers
-
headers属性控制在预检请求期间允许的请求标头。Access-Control-Request-Headers 标头值将根据 headers 属性进行检查。将值设置为
true将允许所有标头。而将值设置为false将禁止所有标头。{headers: true}你可以通过将它们定义为字符串数组来指定允许的标头列表。
{headers: ['Content-Type','Accept','Cookie']}你可以在 HTTP 请求期间使用函数计算
headers配置值。例如:{headers: (requestHeaders, ctx) => {return true}} -
exposeHeaders
-
exposeHeaders属性控制在预检请求期间通过 Access-Control-Expose-Headers 标头公开的标头。{exposeHeaders: ['cache-control','content-language','content-type','expires','last-modified','pragma',]} -
credentials
-
credentials属性控制是否在预检请求期间设置 Access-Control-Allow-Credentials 标头。{credentials: true} -
maxAge
-
maxAge属性控制 Access-Control-Max-Age 响应标头。值以秒为单位。- 将值设置为
null将不会设置标头。 - 而将其设置为
-1会设置标头但禁用缓存。
{maxAge: 90} - 将值设置为
调试 CORS 错误
调试 CORS 问题是一种具有挑战性的体验。但是,除了理解 CORS 规则并调试响应标头以确保一切就绪之外,没有其他捷径。
以下是一些你可以阅读以更好地了解 CORS 工作原理的文章链接。