You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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拦截并修改请求头:

  1. 实现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)
    }
}
  1. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:35:18