Swift - HTTP摘要认证

问题描述 投票:0回答:1

我目前正在反向工程一个家庭自动化API。我想用我自己的应用来管理所有的设置--因为目前确实没有该公司的家庭自动化应用。

总之,我已经用我的 智能家居设备. 为了不使它太复杂。我需要 http摘要认证 用于最后的通信.我已经能够通过命令行用curl连接到我的设备--不幸的是,这在Swift中不能按计划工作。

curl -X POST -d '{"key": "value"}' https://192.168.0.0:1/action -k -s --digest --user username:password

翻译成Swift。

(1)使用Alamofire

import Alamofire
let data: [String: any] = ["key": "value"]
let request = Alamofire.request("https://192.168.0.0:1/action", method: HTTPMethod.post, parameters: data);
request.authenticate(user: "username", password: "password")
request.responseJSON { response in
    // leads to error because of invalid self signed certificate of the smart home device ("https:")
}

注意Alamofire。我想在这种情况下,使用AF这样的外部libary是没有什么意义的 -- 有一些未解决的问题,不能让上述代码工作。(Self signed ceritficates makes problems, using custom manager instances overriding internal stuff leads also to problems) - I've already spent hours believe me.

(2) 使用非Alamofire:)

extension ViewController: URLSessionDelegate {
    public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        let urlCredential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
        completionHandler(.useCredential, urlCredential)
    }
}



let session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: nil)

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

do {
    let jsonData = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)
    request.httpBody = jsonData;
    let task = session.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            return
        }
        let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
        if let responseJSON = responseJSON as? [String: Any] {
        // success
        }
    }
    task.resume()
} catch { }

上面的代码似乎工作得很好--问题是我还没有实现digest认证--因为我没有找到任何方法可以做到这一点。

这将是超级有帮助的,如果有人得到一些提示,如何生成基于用户名和密码的Auth头。

编辑

Curl使用这个 授权 头部。

> Digest username="username", 
realm="XTV", 
nonce="MTU5MDcNc2UxNjQ3OTo1YzMwYjc3YjIxMzAAAGQ5Nzg2NzUzMmRkZGU1ZVVlYw==", 
uri="/action", 
cnonce="MTExOTZlZmI1MjBlYWU0MTIzMDBmNDE0YTkWzJl1MDk=", 
nc=00000001, 
qop=auth, 
response="2ba89269645e2aa24ac6f117d85e190c", 
algorithm="MD5"

有没有可能在Swift中生成这个头?

ios swift http request alamofire
1个回答
0
投票

Digest认证自动支持 URLSession 和Alamofire URLCredential (这就是 authenticate() 在Alamofire中使用),当服务器正确地返回了Alamofire的 WWW-Authenticate 头,并进行适当的摘要设置。

你可以手动生成头,不过由于摘要过程的复杂性,我不建议这样做。我发现 维基百科页 要足够彻底,手动执行标准。

© www.soinside.com 2019 - 2024. All rights reserved.