2017-10-20 16 views
2

J'essaie de transmettre la clé d'autorisation dans l'en-tête d'une URLRequest. Mais à la fin du serveur, la clé n'est pas reçue. La même API lorsqu'elle est appelée à partir du facteur fonctionne bien. Toute autre clé de l'en-tête fonctionne correctement, même la clé d'autorisation est visible à la fin du serveur.URLSession ne passe pas la clé 'Authorization' dans l'en-tête swift 4

Voici mon code:

let headers = [ 
    "authorization": "token abcd" 
] 

var request = URLRequest.init(url: NSURL(string: 
    "http://127.0.0.1:7000/api/channels?filter=contributed")! as URL) 
request.httpMethod = "GET" 
request.allHTTPHeaderFields = headers 
let config = URLSessionConfiguration.default 
config.httpAdditionalHeaders = headers 
let session = URLSession.init(configuration: config) 

let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in 
    if (error != nil) { 
     print(error ?? "") 
    } else { 
     let httpResponse = response as? HTTPURLResponse 
     print(httpResponse ?? "") 
    } 
}) 

Comme vous pouvez le voir, j'ai essayé de mettre le jeton dans les deux config de session et demande, mais personne ne travaille.

+0

Je pense que c'est «Autorisation» mais pas «autorisation»? – chengsam

+0

Essayé les deux mais pas de succès – Santosh

+0

Vous n'avez besoin que d'un seul endroit pour définir l'en-tête auth: 'request.setValue (" \ (type) \ (jeton) ", forHTTPHeaderField:" Autorisation ")' –

Répondre

0

J'ai trouvé la même chose: définir le champ d'en-tête L'autorisation n'a pas fait l'affaire.

Voici la solution je me suis installé sur (qui fonctionne bien):

J'ai ajouté le protocole URLSessionDelegate à ma classe actuelle. Cela signifie malheureusement hériter de NSObject.

Puis, lors de la définition de mon URLSession, j'ai défini son délégué sur 'self'. Enfin, je fournis un gestionnaire de challenge d'authentification.

Dans le code, tout cela ressemble à:

public class SomeHTTPTask: NSObject, URLSessionDelegate { 
    public init() { 
     ... initialize variables ... 
     super.init() 
     ... now you are free to call methods on self ... 
    } 

    public func httpTask(withURL url: URL) { 
     let request = URLRequest(url: url) 
     ... set up request ... 
     let config = URLSessionConfiguration.default 
     let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) 
     let task = session.dataTask(with: request) {data, response, error in 
      ... now you have a result ... 
     } 
    } 

    public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     guard let user = Credentials.sharedInstance.userId, let password = Credentials.sharedInstance.password else { 
      completionHandler(.performDefaultHandling, nil) 
      return 
     } 
     let userCredential = URLCredential(user: user, 
              password: password, 
              persistence: .permanent) 
     completionHandler(.useCredential, userCredential) 
    } 

} 

Si tout va bien, les morceaux sont explicites. C'est juste un gestionnaire de défi d'authentification qui fournit des informations d'identification, si c'est possible. L'URLSession sous-jacente traitera les détails, c'est une authentification NTLM ou Basic, ce genre de choses. En fin de compte, cela semble une solution solide. Au moins, cela a fonctionné pour moi.

Voici une belle reference document from Apple si vous aimez lire ce genre de chose.

-1

On dirait que le problème est que vous modifiez Authorization en-tête en utilisant httpAdditionalHeaders ce qui est quelque chose que vous ne devriez pas faire.

De l'Doc

Un objet NSURLSession est conçu pour gérer les différents aspects du protocole HTTP pour vous. Par conséquent, vous ne devez pas modifier les en-têtes suivants: autorisation, Connexion, hôte, Proxy-Authenticate, Proxy-Authorization, WWW-Authenticate

Retrait de la ligne config.httpAdditionalHeaders = headers devrait résoudre le problème.