URLSession ne fonctionne pas avec URLCredential

j'ai une API à laquelle j'essaie de me connecter et le serveur est une authentification Windows.

je suis en train d'utiliser URLSession avec URLCredential avec le délégué méthodes

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void){

        var disposition: URLSession.AuthChallengeDisposition = URLSession.AuthChallengeDisposition.performDefaultHandling

        var credential:URLCredential?

        print(challenge.protectionSpace.authenticationMethod)

        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)

            if (credential != nil) {
                disposition = URLSession.AuthChallengeDisposition.useCredential
            }
            else
            {
                disposition = URLSession.AuthChallengeDisposition.performDefaultHandling
            }
        }
        else
        {
            disposition = URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge
        }

        completionHandler(disposition, credential);
    }

ce code fonctionne deux fois comme après avoir fait une certaine impression est parce qu'il y a deux méthodes D'authentification:

Nurlauthenticationmethodservertrust et Nslauthenticationmethodntlm when it runs through the Nslauthenticationmethodservertrust everything is fine, but when it runs NSURLAuthenticationMethodNTLM je reçois une erreur sur cette ligne:

credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)

en disant ceci:

fatal error: unexpectedly found nil while unwrapping an Optional value

mais seulement quand je change de cette condition de

if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {

if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM {

Qu'est-ce que je fais de mal?

Voici la méthode que j'utilise pour essayer de me connecter à cette API

func loginUser(_ username: String, password: String, completion: @escaping (_ result: Bool) -> Void)
    {
        //Create request URL as String

        let requestString = String(format:"%@", webservice) as String

        //Covert URL request string to URL

        guard let url = URL(string: requestString) else {
            print("Error: cannot create URL")
            return
        }

        //Convert URL to URLRequest

        let urlRequest = URLRequest(url: url)

        print(urlRequest)

        //Add the username and password to URLCredential

        credentials = URLCredential(user:username, password:password, persistence: .forSession)

        print(credentials)

        //Setup the URLSessionConfiguration

        let config = URLSessionConfiguration.default

        //Setup the URLSession

        let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

        //Prepare the task to get data.

        let task = session.dataTask(with: urlRequest, completionHandler: { (data, response, error) in

            DispatchQueue.main.async(execute: {

                print(error!)

                if(error == nil)
                {
                    completion(true)
                }
                else
                {
                    completion(false)
                }

            })

        })

        //Run the task to get data.

        task.resume()

    } 
9
demandé sur Bista 2016-12-06 18:46:17

1 réponses

Dans le documentation Apple pour URLProtectionSpace.serverTrust, il dit:

nil si la méthode d'authentification de l'espace de protection n'est pas la confiance du serveur.

ainsi, vous essayez de déballer une valeur optionnelle de

dans votre cas, vous pourriez probablement remplacer la fonction entière par (non testé):

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void){

    var disposition: URLSession.AuthChallengeDisposition = URLSession.AuthChallengeDisposition.performDefaultHandling

    print(challenge.protectionSpace.authenticationMethod)

    if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        disposition = URLSession.AuthChallengeDisposition.performDefaultHandling
    }
    else
    {
        disposition = URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge
    }

    completionHandler(disposition, credential);
}
1
répondu Coder256 2016-12-17 14:04:08