我有一个使用 NestJS 的项目 API Rest,实现了 Swagger。一切正常,但我需要保护对 Swagger UI 的访问。 是否可以通过简单的用户/密码或类似的方式来保护 Swagger UI?
是的,可以通过基本授权来限制访问 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-应用程序/
信息也取自那篇文章!
希望这对某人有帮助,我正在使用 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
,它就会提示输入用户名/密码