Search code examples
iosswiftalamofiresdwebimagedigest-authentication

iOS - network call with digest


So we started using a digest mechanism in our project. in the vc i have the following method :

  func imageThumbnailcall() {

    self.indicaotrTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.HandleOverTime), userInfo: nil, repeats: false)
    self.backgroundImageTimer = Timer.scheduledTimer(withTimeInterval: 0.09, repeats: true, block: { (timer) in

        SDWebImageDownloader.shared().setValue("\(UserDefaults.standard.string(forKey: "imageHeader") ?? "YWRtaW46YWRtaW4=")", forHTTPHeaderField: "Authorization")

        SDWebImageDownloader.shared().downloadImage(with:(self.isShowingThermal ? self.thermalUrl : self.visualUrl) as URL, options: [], progress: nil, completed: { (image, data, error, status) in
            self.imageLoaderIndicator.stopAnimating()
            self.backGroundImageView.image = image
        })
    })

}

In the above call i need to replace the header with the digest one, so i made an alamofire call , got the 401 error and got this as headers:

 - some : <NSHTTPURLResponse: 0x1d42265a0> { URL: http://192.168.42.1/images/snapshots/DLTVimage.jpeg } { Status Code: 401, Headers {
Connection =     (
    "keep-alive"
);
"Content-Length" =     (
    195
);
"Content-Type" =     (
    "text/html"
);
Date =     (
    "Tue, 02 Oct 2018 13:22:25 GMT"
);
"Www-Authenticate" =     (
    "Digest algorithm=\"MD5\", qop=\"auth\", realm=\"Restricted access\", nonce=\"18f42caa5bb37111\""
);
 } }

What i understood is that i need to create a string like this:

Digest username="admin",realm="Restricted access",nonce="1d382e075bac95ba",uri="/images/snapshots//IRimage.jpeg",response="54c5aad4e9854201c5e66375f41769d2",cnonce="db860bdba0f3f328",algorithm=MD5,qop=auth,nc=00000001"

and use it as the header. Hoc can i do it and is there a pod that can help with that?


Solution

  • So what i did was the following method:

    func imageStreamTest(url: String, success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
        Alamofire.request(url).authenticate(user: UserDefaults.standard.string(forKey: "userName") ?? "", password: UserDefaults.standard.string(forKey: "password") ?? "").responseData { (responseObject) -> Void in
    
            if responseObject.error != nil {
                return
            }
    
            if let image1 = responseObject.result.value {
                guard let image = UIImage(data: image1) else { return }
                success(image)
            }
        }
    }
    

    Alamofire is handling the digest authentication and i am getting 200 with the data. In the background the 401 failure happening and handled by alamofire