NestJS - 保护对 Swagger UI 的访问

问题描述 投票:0回答:2

我有一个使用 NestJS 的项目 API Rest,实现了 Swagger。一切正常,但我需要保护对 Swagger UI 的访问。 是否可以通过简单的用户/密码或类似的方式来保护 Swagger UI?

security swagger-ui nestjs
2个回答
2
投票

是的,可以通过基本授权来限制访问 Swagger UI。

您可以使用此包进行基本身份验证:

express-basic-auth

安装后

express-basic-auth
,您可能希望为您的端点启用此中间件。

app.use(['/swagger'], basicAuth({
    challenge: true,
    users: {
       [process.env.SWAGGER_USER]: process.env.SWAGGER_PASSWORD,
    },
}));

在初始化 Swagger 之前应用中间件

app.use(['/swagger'], basicAuth({…})
非常重要。

如果您想在生产环境中隐藏 Swagger UI,请查看这篇文章:https://manuel-heidrich.dev/blog/how-to-secure-your-openapi-specification-and-swagger-ui-in-a- Nestjs-应用程序/

信息也取自那篇文章!


0
投票

希望这对某人有帮助,我正在使用 fastify,因此上述库不起作用,但是您可以使用标头

WWW-Authenticate
,它将提示用户输入用户名和密码。我能够使用以下代码提示用户:

 fastify.getInstance().addHook('onRequest', async (request, reply) => {
    if (request.routerPath === '/swagger') {
      const authHeader = request.headers.authorization;

      // If no Authorization header, prompt for credentials
      if (!authHeader) {
        reply.header('WWW-Authenticate', 'Basic realm="Restricted Area"');
        reply.status(401).send(); // Empty body is required for prompt
        return;
      }

      // Decode and validate the Authorization header
      const [scheme, encoded] = authHeader.split(' ');
      if (scheme !== 'Basic' || !encoded) {
        reply.header('WWW-Authenticate', 'Basic realm="Restricted Area"');
        reply.status(401).send(); // Prompt again if invalid
        return;
      }

      const [username, password] = Buffer.from(encoded, 'base64')
        .toString()
        .split(':');
      if (
        username !== process.env.SWAGGER_USERNAME ||
        password !== process.env.SWAGGER_PASSWORD
      ) {
        reply.header('WWW-Authenticate', 'Basic realm="Restricted Area"');
        reply.status(401).send(); // Prompt again if credentials are incorrect
        return;
      }
    }
  });

您可以访问诸如

http://username:password@localhost:3000/swagger
之类的网址来获得访问权限,或者只需点击
localhost:3000/swagger
,它就会提示输入用户名/密码

© www.soinside.com 2019 - 2024. All rights reserved.