나의 플랫폼/iOS

[iOS] Kingfisher 이미지 다운로드시, Authentication with NSURLCredential

GsBOB 2017. 6. 27. 13:59

이건 혹시, 테스트 서버에 접근 할 때, SSL 인증을 통과 시키고자 하시는 분들에게 도움을 드리고자 공유 합니다.

iOS 출시를 위한 서버로 접근은 이 코드를 적용 시켜서는 안됩니다.


먼저 , .plist에 예외 처리 설정을 추가 합니다.


<key>NSAppTransportSecurity</key>

<dict>

<key>NSAllowsArbitraryLoads</key>

<true/>

</dict>



우선, Kingfisher wiki에 SSL 인증과 관련 해서 아래와 같은 내용이 있다.


Modify a request before sending

let modifier = AnyModifier { request in
    var r = request
    r.setValue("", forHTTPHeaderField: "Access-Token")
    return r
}       
imageView.kf.setImage(with: url, placeholder: nil, options: [.requestModifier(modifier)])

Authentication with NSURLCredential

// In ViewController
ImageDownloader.default.authenticationChallengeResponder = self

extension ViewController: AuthenticationChallengeResponsable {
    func downloader(_ downloader: ImageDownloader,
            didReceive challenge: URLAuthenticationChallenge,
               completionHandler: (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
    {
        // Provide your `AuthChallengeDisposition` and `URLCredential`
        let disposition: URLSession.AuthChallengeDisposition = // ..
        let credential: URLCredential? = //..
        completionHandler(disposition, credential)
    }
}


출처 : https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet


위 내용 중 첫번째는 Access-Token이 있어서 인증을 하는 방식 이다.

만약, SSL 인증을 우회 하는 방식으로 하고자 한다면 아래 형태로 하시면 됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import UIKit
import Kingfisher
 
open class SomeViewController: UIViewController, AuthenticationChallengeResponsable {
    
    open override func viewDidLoad() {
        super.viewDidLoad()
 
        ImageDownloader.default.authenticationChallengeResponder = self
    }
    
    public func downloader(_ downloader: ImageDownloader,
                           didReceive challenge: URLAuthenticationChallenge,
                           completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        let disposition = URLSession.AuthChallengeDisposition.useCredential
        let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
        completionHandler(disposition, credential)
    }
    
}
 
 
 
cs


위와 해주시면 됩니다.

참고하세요.