node.js - 如何使用 Swagger 3 将自定义中间件添加到 express-openapi-validator
问题描述
我有一个使用 express-openapi-validator 的 Node 应用程序,它接受一个 api 规范文件(这是一个 .yml 文件),并带有请求和响应验证。express-openapi-validator 包将请求路由到处理程序文件(在规范中定义)。这是其中一个处理程序的样子:
function getUsers(req, res) {
const { 'x-user-id': userId } = req.headers
res.status(200).json(`Your userId is ${userId}`)
}
我有一个 API 密钥功能,用户可以获得新的 API 密钥,以及需要调用者在请求标头中拥有 API 密钥以验证请求的其他端点。
我知道应该可以使用中间件来验证请求,但我不知道如何在选择的端点上使用带有 express-openapi-validator 包的自定义中间件。
例如:
GET /apikey = 不需要 api 密钥 GET /resource = 需要 api 密钥
我该如何配置?
这是我的 app.js 中的 openapi 验证器代码的样子:
new OpenApiValidator({
apiSpec,
validateResponses: true,
operationHandlers: path.join(__dirname, './handlers'),
})
.install(app)
.then(() => {
app.use((err, _, res) => {
res.status(err.status || 500).json({
message: err.message,
errors: err.errors,
});
});
});
解决方案
实际上,我自己最终找到了解决方案。
首先,我使用的是 的版本4.10.5
,express-openapi-validator
所以上面的代码略有不同。
这是它现在的样子:
// index.js
app.use(
OpenApiValidator.middleware({
apiSpec,
validateResponses: true,
operationHandlers: path.join(__dirname, './handlers'),
validateSecurity: {
handlers: {
verifyApiKey(req, scopes) {
return middleware.verifyApiKey(req)
},
bearerAuth(req, scopes) {
return middleware.verifyToken(req)
}
}
},
}),
);
app.use((err, req, res, next) => {
res.status(err.status || 500).json({
message: err.message,
errors: err.errors,
});
我最终在路由中使用中间件的方式如下:
我securitySchemes
在 swagger.yml 文件中添加了一个部分,如下所示:
components:
securitySchemes:
verifyApiKey:
type: apiKey
in: header
name: x-api-key
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
这里有更多关于它的信息:https ://swagger.io/docs/specification/authentication/
在需要中间件的每条路线上,我都添加了一个安全部分,如下所示:
/team:
post:
security:
- bearerAuth: []
description: Create a new team
operationId: createTeam
x-eov-operation-id: createTeam
x-eov-operation-handler: team
正如您在上面的代码(在 index.js 文件中)中看到的那样,我有一个validateSecurity
密钥,该handlers
密钥具有我的 swagger.yml 中的相关密钥(verifyApiKey 和 BearerAuth)。这些函数获取请求和范围以检查它们是否有效。这些函数返回一个布尔值,因此true
意味着中间件允许请求通过,并且false
意味着403
将返回响应。
validateSecurity: {
handlers: {
verifyApiKey(req, scopes) {
return middleware.verifyApiKey(req)
},
bearerAuth(req, scopes) {
return middleware.verifyToken(req)
}
}
},
如果我有任何上述错误,或者解释可以更清楚,请回复。如果您有任何问题,请在下方发布。
推荐阅读
- sql - 将存储过程的多个结果集插入临时表
- amazon-web-services - 如何在 RDS MariaDb 中备份数据库
- python - 对具有多个结果的列进行分组和连接
- javascript - 非零正浮点数的正则表达式
- sql-server - 递归查询以使用初始查询中返回的日期作为后续查询的限制
- shopify - 如何让产品页面上的所有应用程序在主页上的特色产品部分工作?
- flutter - 您如何正确地在颤动中全局存储来自 POST 的数据?
- sql - 在 postgresql 中展平子数组
- java - java.lang.NullPointerException,当使用 Selenium 和 cucumber 进行自动化测试时
- php - 我的 Symfony 应用程序在生产中崩溃,因为它找不到 WebProfilerBundle,我怎样才能让它工作?