Spring Boot应用API新增API Key与API Secret身份认证实现咨询
Spring Boot 第三方客户端API认证落地方案
现有系统已经基于OAuth2+2FA实现了用户认证,优先复用现有OAuth2能力即可,无需重构原有认证逻辑,也能避免两套体系冲突。
1. 依赖准备
如果项目已经引入Spring Security OAuth2 Resource Server可以直接跳过,否则添加如下依赖:
<!-- Maven 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency>
2. 第三方客户端信息存储
新建客户端管理表,核心字段如下:
- 客户端名称
- API Key(设置唯一索引,用于快速查询客户端)
- API Secret(加密存储,用BCrypt或同类不可逆加密算法,禁止明文存储)
- 权限范围(用来控制该客户端可调用的接口范围)
- 启用状态
- 有效期
3. 令牌颁发接口开发
开发公开的POST接口/api/v1/client/token,仅接受application/x-www-form-urlencoded格式请求,入参要求包含client_name、api_key、api_secret三个字段。
接口内部逻辑:
- 根据传入的
api_key查询数据库中对应且处于启用状态的客户端记录 - 把传入的
api_secret做哈希加密后和库中存储的加密值比对,不一致直接返回认证失败 - 比对通过后生成JWT令牌,配置规则:
- 过期时间显式设置为3600秒(1小时)
- payload中新增自定义字段
token_type = CLIENT,和原有用户身份的令牌做明确区分 - 复用现有OAuth2体系的签名密钥对令牌签名,无需新增独立的密钥管理逻辑
注意:该接口要配置为无需认证即可访问,同时添加接口限流规则,避免暴力破解API Key和Secret
4. 多认证体系适配
修改Spring Security的过滤器链配置,新增客户端令牌校验过滤器,执行顺序排在原有用户OAuth2认证过滤器之后:
过滤器逻辑:
- 从请求头
Authorization: Bearer {令牌}中提取传入的身份凭证 - 先执行原有用户OAuth2认证逻辑,校验通过直接放行,走原有用户权限控制逻辑
- 原有用户认证失败的情况下,判断令牌的
token_type是否为客户端令牌:- 校验令牌签名、有效期是否合法
- 校验对应客户端是否仍处于启用状态
- 所有校验通过后,把客户端的权限信息塞入SecurityContext,完成身份认证
- 后续接口权限控制直接复用Spring Security的
@PreAuthorize注解,区分用户权限和客户端权限即可
5. 可选优化点
- 生成令牌的同时存入Redis,设置和JWT相同的过期时间,需要主动吊销客户端令牌时直接删除Redis中的对应记录即可
- 新增API Key和Secret的定期轮换提醒,降低泄露风险
- 客户端调用日志全量留存,方便异常问题排查
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

