iOS中如何在SSO时拦截并修改ASWebAuthenticationSession请求头?
在ASWebAuthenticationSession中自定义请求头(SSO场景)
ASWebAuthenticationSession本身没有提供直接修改或拦截请求头的官方API,这是苹果为了认证流程安全性设置的限制。以下是几种可行的替代方案,你可以根据业务场景选择:
方案1:通过URL查询参数传递自定义业务字段(推荐,若后端支持)
对于user_otherdetails这类自定义业务头,可以将内容编码后附加到认证URL的查询参数中,由后端服务解析使用。这种方式无需修改请求头,是兼容性最好的方案:
var authURL = URL(string: "https://your-sso-domain.com/auth")! let customDetails = "your-custom-info" authURL.append(queryItems: [URLQueryItem(name: "user_otherdetails", value: customDetails)]) let session = ASWebAuthenticationSession(url: authURL, callbackURLScheme: "your-app-scheme") { callbackURL, error in // 处理回调逻辑 } session.start()
局限性:无法修改User-Agent、Connection这类标准HTTP头。
方案2:用WKWebView替代ASWebAuthenticationSession(需自行处理认证安全逻辑)
如果必须修改标准请求头,可以使用WKWebView实现自定义认证流程,通过WKNavigationDelegate拦截并修改请求头:
- 实现
WKNavigationDelegate的请求拦截方法:
class AuthWebViewDelegate: NSObject, WKNavigationDelegate { func webView(_ webView: WKWebView, willSendRequest request: WKWebView.RequestInfo, navigationResponse: WKNavigationResponse?, decisionHandler: @escaping (WKWebView.RequestDecision) -> Void) { var mutableRequest = request.request.mutableCopy() as! NSMutableURLRequest // 修改User-Agent mutableRequest.setValue("Your-Custom-User-Agent", forHTTPHeaderField: "User-Agent") // 修改Connection头 mutableRequest.setValue("keep-alive", forHTTPHeaderField: "Connection") // 添加自定义业务头 mutableRequest.setValue("your-custom-details", forHTTPHeaderField: "user_otherdetails") decisionHandler(.modify(mutableRequest as URLRequest)) } // 监听认证回调URL,自行处理授权码等信息 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { if let callbackURL = navigationAction.request.url, callbackURL.scheme == "your-app-scheme" { // 解析回调URL中的认证信息 decisionHandler(.cancel) // 关闭WebView并处理结果 return } decisionHandler(.allow) } }
- 创建WKWebView并启动认证流程:
let config = WKWebViewConfiguration() let delegate = AuthWebViewDelegate() let webView = WKWebView(frame: view.bounds, configuration: config) webView.navigationDelegate = delegate view.addSubview(webView) let authURL = URL(string: "https://your-sso-domain.com/auth")! webView.load(URLRequest(url: authURL))
注意事项:
- 需要自行处理认证流程的安全性(比如防止钓鱼、验证回调URL的合法性)
- 无法使用ASWebAuthenticationSession的系统级认证上下文(比如Touch ID/Face ID快速登录集成)
方案3:修改全局User-Agent(仅针对User-Agent,兼容性有限)
如果仅需要修改User-Agent,可以尝试通过WKWebView先设置全局User-Agent,再启动ASWebAuthenticationSession(部分iOS版本有效,iOS 13+可能失效):
// 先加载空白页修改全局User-Agent let webView = WKWebView() webView.evaluateJavaScript("navigator.userAgent") { result, error in if let originalUA = result as? String { let customUA = originalUA + " Your-Custom-Suffix" UserDefaults.standard.set(customUA, forKey: "UserAgent") } // 之后启动ASWebAuthenticationSession let session = ASWebAuthenticationSession(url: authURL, callbackURLScheme: "your-app-scheme") { callbackURL, error in // 处理回调 } session.start() }
局限性:
- 全局生效,会影响App内所有WebView的User-Agent
- iOS版本差异大,部分系统版本不生效
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

