L’authentification Digest est-elle possible avec jQuery?

J’essaie d’envoyer une demande nécessitant une authentification HTTP Digest.

Est-ce que Digest est possible dans jQuery?

Si oui, est-ce proche de la bonne façon de le faire? Cela ne fonctionne pas actuellement.

 $.ajax({ url: url, type: 'GET', dataType: 'json', success: function() { alert('hello!'); }, error: function() { alert('error')}, beforeSend: setHeader }); function setHeader(xhr){ xhr.setRequestHeader("Authorization", "Digest username:password"); xhr.setRequestHeader("Accept", "application/json"); }  

Non, le schéma d’authentification d’access Digest est un peu plus complexe car il implémente un mécanisme d’authentification challenge-response qui nécessite les étapes suivantes:

  1. le client envoie une demande pour une ressource protégée contre l’access, mais aucun champ d’en-tête d’ autorisation acceptable n’est envoyé
  2. Le serveur répond par un code d’état “401 Unauthorized” et un champ d’en tête WWW-Authenticate ( digest-challenge ).
  3. le client envoie une autre demande pour la même ressource, mais contenant un champ d’en-tête d’ autorisation en réponse au défi (la réponse digeste )
  4. si l’autorisation échoue, passez à l’étape 2; sinon, le serveur fonctionne normalement.

Cela signifie qu’il y a au moins deux paires requête / réponse.

Chaque champ d’en-tête de réponse WWW-Authenticate a la syntaxe suivante:

 challenge = "Digest" digest-challenge digest-challenge = 1#( realm | [ domain ] | nonce | [ opaque ] |[ stale ] | [ algorithm ] | [ qop-options ] | [auth-param] ) 

Vous devez donc parsingr Digest-Challenge pour obtenir les parameters permettant de générer une réponse Digest pour le champ d’en-tête de demande d’ autorisation avec la syntaxe suivante:

 credentials = "Digest" digest-response digest-response = 1#( username | realm | nonce | digest-uri | response | [ algorithm ] | [cnonce] | [opaque] | [message-qop] | [nonce-count] | [auth-param] ) 

Cette section décrit également comment les parameters de digestion-réponse sont calculés. En particulier, vous aurez probablement besoin d’une implémentation MD5 car c’est l’ algorithme le plus couramment utilisé pour ce schéma d’authentification.

Voici une simple numérotation avec laquelle vous pouvez commencer:

 var ws = '(?:(?:\\r\\n)?[ \\t])+', token = '(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2E\\x30-\\x39\\x3F\\x41-\\x5A\\x5E-\\x7A\\x7C\\x7E]+)', quotedSsortingng = '"(?:[\\x00-\\x0B\\x0D-\\x21\\x23-\\x5B\\\\x5D-\\x7F]|'+ws+'|\\\\[\\x00-\\x7F])*"', tokenizer = RegExp(token+'(?:=(?:'+quotedSsortingng+'|'+token+'))?', 'g'); var tokens = xhr.getResponseHeader("WWW-Authentication").match(tokenizer); 

Cela transformera un champ d’en tête WWW-Authenticate comme:

 WWW-Authenticate: Digest realm="[email protected]", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41" 

dans:

 ['Digest', 'realm="[email protected]"', 'qop="auth,auth-int"', 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"', 'opaque="5ccc069c403ebaf9f0171e9517f40e41"'] 

Ensuite, vous devez parsingr les parameters (vérifier l’existence et la validité) et extraire les valeurs. Notez que les valeurs quoted-ssortingng peuvent être pliées, vous devez donc les déplier (voir aussi l’utilisation de la fonction unq dans le RFC):

 function unq(quotedSsortingng) { return quotedSsortingng.substr(1, quotedSsortingng.length-2).replace(/(?:(?:\r\n)?[ \t])+/g, " "); } 

Avec cela, vous devriez être capable de le mettre en œuvre vous-même.

C’est possible avec JavaScript javascript. Essayez digestAuthRequest.js:

https://github.com/inorganik/digest-auth-request

Vous devriez essayer le plugin digestj jquery.

http://code.google.com/p/digestj/

Il s’agit d’une mise en œuvre partielle, mais pourrait suffire à vous aider à passer au travers.