Skip to main content

服务网关与身份鉴权

服务网关与身份鉴权是现代微服务架构中保证安全、路由转发、用户身份控制的核心组件。


🧭 什么是服务网关(API Gateway)?

服务网关是客户端与后端服务之间的中间层,用于:

  • 请求路由
  • 用户身份认证与权限校验
  • 限流与熔断
  • 日志收集与审计
  • 跨域处理

常见网关选型

网关技术栈特点
NginxC高性能、可扩展
Kong基于 Nginx + Lua插件丰富、支持 JWT/OAuth
Spring Cloud GatewayJava与 Spring 微服务深度集成
AWS API Gateway云原生云服务集成好、可视化
TraefikGo云原生友好、自动发现

🔐 身份认证与鉴权

类型作用示例
认证(Authentication)验证“你是谁”登录校验
鉴权(Authorization)判断“你是否有权限做某事”是否能访问 /admin 接口

常见方式

方式场景描述
Cookie + Session单体系统服务端存储状态
Token(JWT)前后端分离客户端持有,服务端无状态
OAuth2 / OIDC第三方登录、企业系统标准化认证授权
API Key内部接口调用静态密钥识别

🧑‍💻 实战代码示例

✅ Nginx 网关配置

server {
listen 80;
server_name api.example.com;

location /auth/ {
proxy_pass http://auth-service;
}

location /user/ {
proxy_pass http://user-service;
}
}

✅ Node.js JWT 鉴权中间件

const jwt = require("jsonwebtoken");

function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(" ")[1];
if (!token) return res.sendStatus(401);

try {
const payload = jwt.verify(token, "SECRET_KEY");
req.user = payload;
next();
} catch (err) {
res.sendStatus(403);
}
}

✅ JWT 签发示例

const token = jwt.sign({ userId: 123, role: "admin" }, "SECRET_KEY", { expiresIn: "1h" });
res.json({ token });

✅ Spring Cloud Gateway 配置

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_service", r -> r.path("/user/**")
.filters(f -> f.filter(new JwtAuthFilter()))
.uri("lb://user-service"))
.build();
}

🎯 应用场景推荐

场景推荐网关鉴权机制
Web 前后端分离Nginx + JWTToken
Spring 微服务系统Spring Gateway + JWT/OAuth2JWT
多租户 SaaS 接口开放Kong + OAuth2 插件OAuth2
云上无服务器架构AWS API Gateway + CognitoOIDC

🧠 常见问题

JWT 认证如何防止被篡改?

JWT 使用签名算法(如 HS256)对 payload 进行签名。验证时用相同秘钥校验签名是否一致。

Token 如何失效?

可以设置 expiresIn 到期时间,或使用 Redis 存储黑名单进行主动吊销。

为什么网关推荐做鉴权?

统一入口统一校验,防止重复实现;对外隐藏内部微服务架构。


📚 推荐资源