在Linux环境中为Swagger(OpenAPI)设置认证机制通常涉及以下几个方面。以下是详细的设置方法:
# swagger.yaml 或 openapi.yaml 文件
securityDefinitions:
basicAuth:
type: basic
description: HTTP Basic Authentication
security:
- basicAuth: []
const express = require('express');
const swaggerUi = require('swagger-ui-express');
const basicAuth = require('express-basic-auth');
const app = express();
// 设置Swagger UI的Basic Auth
app.use('/api-docs',
basicAuth({
users: { 'admin': 'password123' },
challenge: true
}),
swaggerUi.serve,
swaggerUi.setup(swaggerDocument)
);
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- bearerAuth: []
const express = require('express');
const jwt = require('jsonwebtoken');
const swaggerUi = require('swagger-ui-express');
const app = express();
// JWT验证中间件
const authenticateJWT = (req, res, next) => {
const authHeader = req.headers.authorization;
if (authHeader) {
const token = authHeader.split(' ')[1];
jwt.verify(token, 'your-secret-key', (err, user) => {
if (err) {
return res.sendStatus(403);
}
req.user = user;
next();
});
} else {
res.sendStatus(401);
}
};
app.use('/api-docs', authenticateJWT, swaggerUi.serve, swaggerUi.setup(swaggerDocument));
components:
securitySchemes:
oAuth2:
type: oauth2
flows:
authorizationCode:
authorizationUrl: https://example.com/oauth/authorize
tokenUrl: https://example.com/oauth/token
scopes:
read: Grants read access
write: Grants write access
admin: Grants access to admin operations
security:
- oAuth2:
- read
- write
components:
securitySchemes:
apiKey:
type: apiKey
name: X-API-KEY
in: header
security:
- apiKey: []
const apiKeyAuth = (req, res, next) => {
const apiKey = req.headers['x-api-key'];
if (apiKey === 'your-api-key-here') {
next();
} else {
res.status(401).json({ error: 'Unauthorized' });
}
};
app.use('/api-docs', apiKeyAuth, swaggerUi.serve, swaggerUi.setup(swaggerDocument));
如果你使用Nginx作为反向代理,可以在Nginx层面设置认证:
location /api-docs {
auth_basic "Swagger UI Access";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
创建密码文件:
sudo sh -c "echo -n 'admin:' >> /etc/nginx/.htpasswd"
sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
@Configuration
public class SwaggerConfig {
@Bean
public SecurityConfiguration security() {
return SecurityConfigurationBuilder.builder()
.clientId("test-client-id")
.clientSecret("test-client-secret")
.realm("test-realm")
.appName("test-app")
.scopeSeparator(",")
.additionalQueryStringParams(null)
.useBasicAuthenticationWithAccessCodeGrant(false)
.build();
}
@Bean
public SecurityScheme apiKey() {
return new ApiKey("apiKey", "X-API-KEY", "header");
}
@Bean
public SecurityScheme basicAuth() {
return new BasicAuth("basicAuth");
}
}
根据你的具体应用场景和安全需求,选择最适合的认证机制。