iOS应用嵌入网页时如何安全获取不可篡改的bundle id实现嵌入权限限制
问题结论
首先明确:不存在iOS系统原生提供的、完全无法篡改的机制,可以让Web服务端直接从WKWebView或SFSafariViewController的请求中自动获取发起请求的App的Bundle ID。你通过代理工具抓包看不到对应字段是正常的,苹果本身就没有在WebView的请求头里加这个标识的设计。
常见误解说明
你提到的谷歌OAuth配置页要求填写Bundle ID,并不是谷歌能直接拿到请求的Bundle ID,而是这套流程用了回调校验逻辑:登录完成后的回调只会跳转到你提前配置的、和Bundle ID绑定的自定义Scheme或者Universal Link,第三方App就算伪造请求发起OAuth,也拿不到最终的授权凭证,本质是回调环节的校验,不是请求环节直接获取Bundle ID。
符合你需求的替代实现方案
你不需要硬编码凭证,也能达到和Web端Origin白名单同等的防滥用效果,可选方案如下:
- 首选方案:搭配苹果
App Attest服务做身份校验- 你司后端提前接入App Attest校验能力,App端在请求登录页之前,先调用苹果接口生成校验凭证,发给你司后端
- 后端通过苹果公钥校验凭证确实来自你正版的、未被篡改的App后,下发一个有效期不超过5分钟的一次性临时令牌
- 将临时令牌作为查询参数拼到登录页URL后再加载,登录页后端先校验令牌有效性,校验通过才返回登录页面,无效直接拒绝访问。这个方案的凭证是苹果系统层面生成的,第三方应用根本无法伪造,安全性远高于自定义请求头。
- 过渡方案:用Universal Link回调做权限拦截
如果V1版本赶时间不想接App Attest,可以先用这套方案过渡:- 给你的App配置好对应域名的Universal Link关联,仅你的Bundle ID有权限响应该域名的跳转
- 登录流程走
SFSafariViewController加载,登录成功后的回调跳转统一走你配置的Universal Link,只有你自己的App能收到回调拿到登录凭证,第三方App就算能打开你的登录页,也拿不到最终的登录结果,等于登录流程完全无效。
内容的提问来源于stack exchange,提问作者Simon McLoughlin
相关产品推荐
相关产品推荐

