CORS
CORS 帮助您保护应用程序免受浏览器环境中通过脚本触发的恶意请求。
例如,如果从不同域名向您的服务器发送 AJAX 或 fetch 请求,浏览器会使用 CORS 错误阻止该请求,并期望您实现 CORS 策略(如果您认为应该允许该请求)。
在 AdonisJS 中,您可以使用 @adonisjs/cors 包来实现 CORS 策略。该包附带一个 HTTP 中间件,用于拦截传入请求并以正确的 CORS 头进行响应。
安装
使用以下命令安装和配置包:
node ace add @adonisjs/cors:::disclosure
使用检测到的包管理器安装
@adonisjs/cors包。在
adonisrc.ts文件中注册以下服务提供器。ts{ providers: [ // ...其他提供器 () => import('@adonisjs/cors/cors_provider') ] }创建
config/cors.ts文件。该文件包含 CORS 的配置设置。在
start/kernel.ts文件中注册以下中间件。tsserver.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 corsConfigenabled
临时打开或关闭中间件,无需从中间件栈中移除它。
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 的工作原理。