2017-02-12 4 views
0

저는 iOS 개발의 초보자입니다. 인증을 통해 IBM Domino 서버의 일부 데이터에 액세스하려고합니다. 코드는 서버의 로그인 페이지 만 되돌릴 수 있습니다. 누구 잘못 알아요?스위프트 3 IBM Domino 서버의 URLSession 인증

class URLSessionTest: NSObject, URLSessionDelegate { 

let user = "myUser" 
let password = "myPwd" 
let url = URL.init(string: "https://www.example.com/Test.nsf/0/91182C6C9EEE0414C12580A300312D1A?Opendocument") 


func getData() { 
    var request = URLRequest.init(url: url!) 
    request.httpMethod = "POST" 
    request.timeoutInterval = 30.0 
    let parameters = ["Username": user, "Password": password] as Dictionary<String, String> 
    do { 
     request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) 
    } catch let error { 
     print("request serialization error: \(error.localizedDescription)") 
    } 
    let configuration = URLSessionConfiguration.default 
    let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil) 
    let task = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in 
     if error != nil { 
      print ("dataTask error: \(error!.localizedDescription)") 
     } 
     if let myresponse = response as? HTTPURLResponse { 
      print ("dataTask response: \(myresponse)") 
      myresponse.statusCode 
     } 
     let myval = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)! 
     print("dataTask data: \(myval)") 
    }) 
    task.resume() 
} 

그리고 대표 :

challenge NSURLAuthenticationMethodServerTrust 
Server Trust 
Use credential 
dataTask response: <NSHTTPURLResponse: 0x610000031780> { URL: https://www.example.com/Test.nsf/0/91182C6C9EEE0414C12580A300312D1A?Opendocument } { status code: 200, headers { 
"Cache-Control" = "no-cache"; 
"Content-Length" = 5949; 
"Content-Type" = "text/html; charset=UTF-8"; 
Date = "Sun, 12 Feb 2017 19:14:19 GMT"; 
Expires = "Tue, 01 Jan 1980 06:00:00 GMT"; 
Server = "Lotus-Domino"; 
"Strict-Transport-Security" = "max-age=0";} } 
+0

내 생각에 코드에 기본 인증이 필요합니다. 문제의 도메인에 대해 Domino 서버가 사용하도록 설정된 인증 방법을 확인하십시오. –

+0

이것은 IBM 특정 문제로 보입니다. 필자는 IBM Websphere Portal에 액세스하여 IBM Domino와 같은 유사한 결과를 보았습니다. 그러나 Microsoft SharePoint 사이트에 로그인하려고했는데 성공했습니다. –

+1

인증을 위해 IBM Domino 및 IBM Websphere 서버가 LTPA를 사용하도록 설정되었을 수 있습니다. 이것은 귀하의 문제를 설명 할 수 있습니다. 따라서 대부분의 경우 IBM Domino 서버의 사이트에 대한 인증 방법을 기본 인증 –

답변

1

: 여기

open func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void){ 
    print ("challenge \(challenge.protectionSpace.authenticationMethod)") 
    var disposition: URLSession.AuthChallengeDisposition = .useCredential 
    var credential:URLCredential? 
    let defaultCredential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.none) 
    if challenge.previousFailureCount > 0 { 
     print ("cancel authentication challenge") 
     disposition = .cancelAuthenticationChallenge 
     credential = nil 
    } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
     print ("Server Trust") 
     credential = URLCredential(trust: challenge.protectionSpace.serverTrust!) 

     if (credential != nil) { 
      print ("Use credential") 
      disposition = .useCredential 
     } 
     else{ 
      print ("perform default handling") 
      disposition = .performDefaultHandling 
      credential = defaultCredential 
     } 
    } 
    else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate { 
     print ("client certificate") 
    } 
    else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic { 
     print ("Basic authentication") 
    } 
    else{ 
     disposition = .cancelAuthenticationChallenge 
     credential = nil 
    } 
    if credential != nil { challenge.sender!.use(credential!, for: challenge)} 
    completionHandler(disposition, credential); 
} 

func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
    print ("URLSessionTask didReceive") 
    let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession) 
    challenge.sender?.use(credential, for: challenge) 
    completionHandler(URLSession.AuthChallengeDisposition.useCredential,credential) 
} 

코드의 출력 (내 영어 죄송합니다) 여기

내 데이터를 얻을 수있는 코드 @Per Henrik Lausten의 의견에 비추어, Domino 서버는 세션 인증을 우회하여 기본 인증을 허용하는 방법을 제공합니다. f 특정 애플리케이션에 액세스하는 URL 이 방법은 this IBM technote에 설명되어 있습니다. 이것은 전체 사이트를 기본 인증으로 여는 것보다 나은 대안입니다. 나는 당신이 https를 사용하고있는 것을 보았습니다, 그러나 그것들이 이미 그렇게 설정되어 있지 않다면 당신이 접근하고있는 NSF 파일의 프로퍼티는 또한 https 연결을 필요로하도록 설정되어야합니다.

+0

으로 변경해야합니다. 결국 기본 인증에 그대로 남아 있기 때문에 실제로 작동합니다. 감사! –

+0

작동하기 때문에 위의 투표를 고려하고 내 대답을 수락하십시오. –