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:
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:
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.