Swift 和 Alamofire SSL 固定和处理挑战

plg*_*lso 0 json challenge-response swift alamofire

当我尝试从内部 Web 服务器获取 json 时,我需要应对挑战。我从上一个问题中遵循了这一点。这是我的代码

let defaultManager: Alamofire.SessionManager = {
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "myhttpsinternaldomain.org": .disableEvaluation
            ]

            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

            return Alamofire.SessionManager(
                configuration: configuration,
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
        }()

        let url = URL(string: urlString)
        let username = "user"
        let password = "password"
        let header = ["user": username, "password": password]

        defaultManager.request(url!, method: .get, headers: header).responseJSON { response in
            switch response.result {
            case .success(let value):
                let json = JSON(value)
                print("JSON: \(json)")
            case .failure(let error):
                print(error)
            }
        }
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误

错误域=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey= https://myhttpsinternaldomain.org , NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey= https://myhttpsinternaldomain.org }

我找到了这个,但我的项目中没有令牌。我只想使用用户名和密码或忽略挑战

请任何帮助

plg*_*lso 5

知道了!或者更确切地说,我找到了正确的页面,这让我找到了答案。 Github Page Server Trust Policy Manager使用 Alamofire 连接到自签名服务器

最初,在 SSL 拒绝我的身份验证之后,我会收到 310 错误。

然后我添加了我最初发布的经理类并收到一个 -999 错误,说它被“取消”了。感谢上面的 Github Page 原因是因为我需要

“确保保留对新 SessionManager 实例的引用,否则当您的 sessionManager 被释放时,您的请求将全部取消。”

因此,由于第二个 stackoverflow 页面,我创建了一个 NetworkManager 类,并在我的 alamofire 请求中调用它。

这是下面有效的代码,希望这会为某人节省很多时间。

// Network Manager outside view controller

        class NetworkManager {
        static let sharedInstance = NetworkManager()

        let manager: Alamofire.SessionManager = {
            let serverTrustPolicies: [String: ServerTrustPolicy] = [
                "https://mydomainthatwasdrivingmebananas.com": .pinCertificates(
                    certificates: ServerTrustPolicy.certificates(),
                    validateCertificateChain: true,
                    validateHost: true),
                "mydomainthatwasdrivingmebananas.com": .disableEvaluation
            ]

            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

            return Alamofire.SessionManager(
                configuration: configuration,
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
            )
        }()
    }
Run Code Online (Sandbox Code Playgroud)

然后 Alamofire 电话

// Inside ViewController ViewDidLoad

NetworkManager.sharedInstance.manager.request("https://mydomainthatwasdrivingmebananas.com", method: .get).responseJSON{ response in
                switch response.result {
                                case .success(let value):
                                    let json = JSON(value)
                                    print("JSON: \(json)")
                                case .failure(let error):
                                    print(error)
                                }

        }
Run Code Online (Sandbox Code Playgroud)

PS JSON() 方法是 swifty JSON,以防有人感到困惑