如何保障Spring Boot中苹果IAP服务端通知接收端点的安全性
解决方案
1. 核心校验:验证苹果服务器通知签名(最关键)
苹果官方推送的服务器通知采用JWS格式签名,你可以直接通过验签确认请求来源合法性,这是安全性的核心保障,即使接口地址泄露,伪造的请求无法通过签名校验会被直接拒绝:
- 你需要先把请求实体调整为接收苹果返回的
signedPayload字段,而非自定义的responseBody - 调用苹果官方提供的验签工具类,用苹果根证书对JWS串做校验,校验通过才处理后续业务,校验不通过直接返回403
注意:苹果的签名校验逻辑不需要你和苹果做额外的鉴权交互,所有验证逻辑都可以在你本地完成,不需要苹果端适配任何逻辑。
2. 路径隐藏:配置高复杂度端点路径
把现有接口路径修改为带随机长字符串的无规则路径,比如:
@PostMapping("/v1/apple-notify-8a7d3f9c2e1b6d4a8f7c3e5b1d9a2f8c") Response<Integer> handleNotification(@RequestBody ServerNotificationRequest request);
32位以上的随机字符串几乎不可能被路径扫描或嗅探工具枚举到,从入口层面降低被恶意访问的概率。
3. 访问限制:配置IP白名单
苹果官方公开了所有推送服务器通知的IP段,你可以在网关层或者Spring Security配置中,仅允许这些IP段访问该通知端点,其他来源IP直接拒绝访问,进一步收窄访问范围。
4. 鉴权配置:单独豁免该端点的OAuth2校验
不需要全局关闭鉴权,只需要在你的Spring Security配置类中,单独将该苹果通知端点设置为无需鉴权即可访问:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // 单独豁免苹果通知端点 .antMatchers("/post/notification/v1/apple-notify-*").permitAll() // 其他接口保持原有鉴权逻辑 .anyRequest().authenticated() .and().oauth2ResourceServer().jwt(); } }
不需要把端点设为非公开,你只要做好前面三个安全措施,即使路径被泄露也不会有安全风险。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

