微服务安全(OAuth2 + JWT)
文章目录
第一章:安全设计的必要性——像游乐园的安检门
想象你运营一家主题乐园:
- **游客(用户)**需要门票(凭证)才能进入
- **不同区域(服务)**需要不同权限(VIP区需额外手环)
- **黄牛(攻击者)**可能伪造门票混入
OAuth2 + JWT 就是游乐园的“智能安检系统”,它解决了三个核心问题:
- 如何安全分发门票(认证)
- 如何验证门票真伪(鉴权)
- 如何限制黄牛倒卖(令牌时效性)
第二章:OAuth2 的四张“门票”
OAuth2 定义了四种授权方式,就像游乐园的不同购票渠道:
1. 密码模式(直接买票)
适用场景:自家APP登录
// 密码模式获取令牌
POST /oauth/token
grant_type=password&username=user&password=123&client_id=app
2. 授权码模式(第三方代购)
适用场景:微信登录、Google登录
流程:
- 跳转到第三方登录页
- 用户授权后返回授权码
- 用授权码兑换令牌
3. 客户端模式(员工通道)
适用场景:服务间内部通信
POST /oauth/token
grant_type=client_credentials&client_id=service&client_secret=abc
4. 简化模式(快速通道)
适用场景:纯前端应用(无服务端)
第三章:JWT——防伪会员卡
JWT(JSON Web Token)就像一张加密的会员卡,包含:
- 卡面信息(Payload):用户ID、权限、有效期
- 防伪标识(签名):用密钥生成,无法伪造
代码示例:生成JWT
public String createJwt(User user) {
// 当前时间与过期时间
Date now = new Date();
Date expire = new Date(now.getTime() + 3600 * 1000);
// 构建JWT(像打印会员卡)
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.setSubject(user.getId().toString())
.claim("role", user.getRole()) // 自定义信息
.setIssuedAt(now)
.