SwiftのAlamofireを使用してのSSL通信の認証に少しはまったので備忘録。
※基本的な使い方は、他の人を参照下さい。
※この方法が正しいのかは分かりませんが、とりあえず成功はしました。
Objectice-C時代の<-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge>をAlamofireで受け取れればと、
いろいろ調べたり、Alamofireのコードをちょっと調べたりして、
AlamofireのSessionDelegateクラスにある (NSURLSessionAuthChallengeDisposition, NSURLCredential!))?>が受け取れるようになれば実現できそう。
このSessionDelegateクラスは、Alamofireのinitにて生成されていたので、以下の形で受け取るようにしました。
var alamoManger: Manager!
alamoManger = Manager(configuration: configuration)
let delegate: Manager.SessionDelegate = alamoManger.delegate
// HTTPS Authentication
delegate.sessionDidReceiveChallenge = { (session: NSURLSession!, challenge: NSURLAuthenticationChallenge) in
return (.UseCredential, self.createSSLCertificate(challenge)! )
}
NSURLCredentialを生成するメソッド
func createSSLCertificate(challenge: NSURLAuthenticationChallenge) -> NSURLCredential! {
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic
|| challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPDigest{
// Basic認証
}
else {
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
// SSL通信
}
}
}
リクエストする時はpublicクラスのAlamofireではなく、生成したManagerクラスをして行います。
alamoManger
.request(.POST, url, parameters: parameters)
.responseJSON({(request, response, data, error) in
)
とりあえず、このコードで成功はしたのですが、何か間違っていたら教えて下さい。