Xamarin iOS实现SSO时如何处理scheme为https://的重定向URI
iOS系统全局保留https/http协议的分发权限,你在Info.plist中将https注册为自定义URL Scheme的操作是完全无效的,系统不会将普通HTTPS链接的跳转分发给第三方App,这就是当前Web Authenticator将回调地址识别为普通网页加载、抛出导航错误的核心原因。
在无法使用通用链接的前提下,有两个可直接落地的方案,不需要修改服务端的HTTPS重定向规则:
方案1:基于系统认证会话的原生回调拦截(推荐)
你调用的WebAuthenticator.AuthenticateAsync在iOS端的底层实现是基于系统提供的ASWebAuthenticationSession(iOS 13+)/SFAuthenticationSession(iOS 12)组件,该组件本身自带回调拦截能力:只要认证流程结束后跳转到你预先指定的回调地址,系统会直接拦截该跳转,不会将请求发送给Safari加载,直接把回调的参数内容返回给当前App,不需要注册自定义URL Scheme,也不需要配置通用链接。
你只需要做两处修改:
- 删除当前
Info.plist中CFBundleURLTypes下注册https协议的整段配置,无效的配置反而会干扰系统的拦截逻辑。 - 在
Info.plist中添加系统要求的回调协议声明,否则会被系统权限拦截:
<key>ASWebAuthenticationSessionCallbackURLSchemes</key> <array> <string>https</string> </array>
修改完成后原有业务代码不需要调整,你贴出的WebAuthenticatorBrowser类逻辑本身没有问题,服务端跳转到https://myAppName时系统会自动捕获跳转,将认证结果返回给Web Authenticator,不会再出现加载网页报错的问题。
方案2:嵌入式WebView自定义拦截(兼容极低版本系统)
如果需要适配iOS 11及以下不支持系统认证会话的版本,可以放弃默认的Web Authenticator浏览器实现,自定义基于WKWebView的认证浏览器:
- 用内嵌的
WKWebView加载认证起始页,不要跳转到外部Safari - 通过
WKNavigationDelegate的decidePolicyForNavigationAction代理方法监听所有导航请求 - 当检测到导航目标URL匹配你预设的
https://myAppName回调地址时,直接取消导航,从请求URL中提取认证需要的code、state等参数 - 将提取到的参数封装为
WebAuthenticatorResult返回给业务层即可
这个方案的逻辑完全在App内部闭环,不需要任何系统级的跳转配置,也不会触发外部浏览器加载回调地址。
内容的提问来源于stack exchange,提问作者TheRealEddieDean

