繁体   English   中英

在 Node/Express API 上禁用 Swagger

[英]Disable Swagger on Node/Express API

我正在使用 Swagger 在我的开发环境中记录我的节点/Express API。 它运行良好,但现在我需要在生产时禁用它,以免公开访问 API 定义。

有没有办法做到这一点,例如使用一些 npm 脚本?

谢谢

按照惯例,您想设置 NODE_ENV 环境变量(环境变量是在操作系统上设置的值,不依赖于您的应用程序)以使事情取决于您当前所在的环境。 这在很大程度上取决于您在何处托管生产应用程序。

  • 例如,如果是 AWS ECS 部署,则需要在 AWS Systems Manager Parameter Store 中进行设置。
  • 或者,如果它只是您通过 ssh 进入的普通云实例,您可能会使用类似于node app.jsnpm run start运行您的应用程序(或者您可能正在使用 docker 并且您的脚本以这些命令之一结束。 ) 无论如何,在执行“运行应用程序”命令之前,请确保通过export NODE_ENV=production命令export NODE_ENV=production环境设置为生产。 您可以通过echo $NODE_ENV命令检查它是否有效。
  • 或者,如果您使用 docker-compose,您可以将环境变量设置为: 它在这里说开发,但你会把它设置为生产

无论如何,一旦您确定 NODE_ENV 在应用程序在生产环境中运行时是生产环境,并且具有以下假设:

  • 您的应用程序在您的启动文件中被命名为“app”,您将中间件定义为“app.use(...”
  • 你的招摇路线类似于“ http://localhost:PORT/docs

有了这些假设,使它成为代码中第一个“app.use”类型的中间件定义:

if(process.env.NODE_ENV === "production"){
  app.use('/docs', (req, res, next) => {
    res.status(404).send("Not Found");
  });
}

如果我所做的任何假设与您的情况不相关,请相应地调整它们。 你已经完成了。

如果对swagger-UI使用swagger-express-mwswagger-tools

这就是我在 app.js 中做同样的事情

if (process.env.NODE_ENV === 'development') {
  SwaggerExpress.create(config, function (err, swaggerExpress) {
    if (err) { throw err; }

    app.use(SwaggerUi(swaggerExpress.runner.swagger));
    // install middleware
    swaggerExpress.register(app);

    app.listen(PORT);
  });
} else {
  app.listen(PORT, () => console.log(`Server started @ Port - ${PORT}`));
}

除了禁用 Swagger UI 之外,您还可以选择对其进行访问保护。 以下是我们如何使用 HTTP Basic Auth 完成这两项操作。 在您的main.ts或等效文件中,这里有一个使用 NEST 的 Node.js 应用程序:

const customNestApplication = (app: INestApplication) => {

  // [...]

  const swaggerEnabled = configService.get('swagger.enabled', { infer: true });

  if (
    swaggerEnabled &&
    configService.get('swagger.auth.user', { infer: true }) &&
    configService.get('swagger.auth.password', { infer: true })
  ) {
    app.use(
      `${configService.get('swagger.path', { infer: true })}`,
      basicAuth({
        challenge: true,
        users: {
          [configService.get('swagger.auth.user', { infer: true })]: 
          configService.get('swagger.auth.password', { infer: true }),
        },
      }),
    );
  }

  // Set up Swagger as usual, etc.
  // [...]

  return app.listen(port);
};

有关更多详细信息,另请参阅另一个专门关于 Swagger 身份验证的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM