You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Swagger UI未将指定Header加入请求的问题

问题:Swagger UI发起请求时未携带定义的Authorization Header

测试用户登出接口时,发现通过Bearer Token携带的Authorization Header未被添加到Swagger UI发起的实际请求中,尽管接口YAML配置里已经明确定义了该Header,但始终不生效。


相关配置

1. Swagger接口YAML配置

/**
 * @swagger
 * /api/v1/users/auth/logout:
 *   post:
 *     tags:
 *       - Logout
 *     summary: Logout user
 *     description: Logout user from the system
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               phoneNumber:
 *                 type: string
 *                 description: User phone number
 *                 example: +201026984193
 *             required:
 *               - phoneNumber
 *     parameters:
 *       - in: header
 *         name: Authorization
 *         description: Bearer token for authentication
 *         required: true
 *         schema:
 *           type: string
 *         example: Bearer ERxoQss46UzGt0SAO0oZO7DykNT4KMvlKqJFcwctFt5DrjyBgCpi9l8H54SuoFlU
 *     responses:
 *       '400':
 *         description: Phone number is required
 *       '401':
 *         description: Phone number is not valid
 *       '404':
 *         description: User not found
 *       '204':
 *         description: User logged out successfully
 *       '409':
 *         description: Missing token
 *       '403':
 *         description: Unauthorized
 *       '406':
 *         description: Missing token and/or phoneNumber
 *       '405':
 *         description: Unauthorized
 *       '500':
 *         description: Internal server error. Something went wrong on the server.
 *       '429':
 *         description: Too many auth requests, please try again later.
 */

2. Swagger配置文件代码

const swaggerJsdoc = require("swagger-jsdoc");
const swaggerUi = require("swagger-ui-express");
const ip = require("ip");
const fs = require("fs");
require("dotenv").config();

const options = {
    definition: {
        openapi: "3.0.0",
        info: {
            title: "",
            description: "",
            version: "1.0.0",
        },
        servers: [
            {
                // url: `http://${ip.address()}:${process.env.PORT || 3000}`,
                url: `http://localhost:${process.env.PORT || 3000}`,
            },
        ],
        security: [{ Authorization: [] }],
    },
    apis: ["./routes/*.js"],
    customCss: `
        .swagger-ui .topbar-wrapper svg {
            display: none;
        }
    `,
};
const swaggerSpec = swaggerJsdoc(options);
const customCss = fs.readFileSync(process.cwd() + "/swagger.css", "utf8");

function swaggerDocs(app, port) {
    app.use(
        "/docs",
        swaggerUi.serve,
        swaggerUi.setup(swaggerSpec, { customCss })
    );
}
module.exports = swaggerDocs;

解决方案

1. 补充Security Scheme定义

当前配置里的security: [{ Authorization: [] }]缺少对应的安全方案说明,Swagger UI无法识别该参数的格式。需要在OpenAPI定义的components节点下添加securitySchemes配置:

修改Swagger配置文件中的options.definition部分:

const options = {
    definition: {
        openapi: "3.0.0",
        info: {
            title: "",
            description: "",
            version: "1.0.0",
        },
        servers: [
            {
                url: `http://localhost:${process.env.PORT || 3000}`,
            },
        ],
        components: {
            securitySchemes: {
                Authorization: {
                    type: "http",
                    scheme: "bearer",
                    bearerFormat: "JWT" // 可选,用于说明Token格式
                }
            }
        },
        security: [{ Authorization: [] }],
    },
    // 其余配置保持不变
};

2. 移除接口级别的Header参数定义

全局安全配置生效后,Swagger UI会自动生成Token输入框,此时接口YAML中单独定义的parameters会和全局配置冲突,建议移除接口里的Header参数定义:

修改后的接口YAML:

/**
 * @swagger
 * /api/v1/users/auth/logout:
 *   post:
 *     tags:
 *       - Logout
 *     summary: Logout user
 *     description: Logout user from the system
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               phoneNumber:
 *                 type: string
 *                 description: User phone number
 *                 example: +201026984193
 *             required:
 *               - phoneNumber
 *     responses:
 *       '400':
 *         description: Phone number is required
 *       '401':
 *         description: Phone number is not valid
 *       '404':
 *         description: User not found
 *       '204':
 *         description: User logged out successfully
 *       '409':
 *         description: Missing token
 *       '403':
 *         description: Unauthorized
 *       '406':
 *         description: Missing token and/or phoneNumber
 *       '405':
 *         description: Unauthorized
 *       '500':
 *         description: Internal server error. Something went wrong on the server.
 *       '429':
 *         description: Too many auth requests, please try again later.
 */

3. 验证配置效果

重启服务后,Swagger UI顶部会出现Authorize按钮,点击后输入格式为Bearer <你的Token>的内容,之后发起的所有请求都会自动携带Authorization Header。如果仅需单个接口生效,可移除全局security配置,在接口级别添加security: [{ Authorization: [] }]。


内容的提问来源于stack exchange,提问作者Twfyq Bhyry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:04:51