J'essaie d'envoyer une demande nécessitant une authentification HTTP Digest.
Digest est-il possible dans jQuery?
Si oui, est-ce proche de la bonne façon de le faire? Ce n'est pas en train de travailler.
<script type="text/javascript">
$.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");
}
</script>
Non, le Digest Access Authentification Schéma est un peu plus complexe car il implémente un mécanisme d'authentification de défi-réponse nécessitant les étapes suivantes:
Cela signifie qu'il y a au moins deux paires de demandes/de réponse.
Chacun www-authentifier Champ d'en-tête de réponse a la syntaxe:
challenge = "Digest" digest-challenge digest-challenge = 1#( realm | [ domain ] | nonce | [ opaque ] |[ stale ] | [ algorithm ] | [ qop-options ] | [auth-param] )
Donc, vous devez analyser Digest-Challenge Pour que les paramètres puissent générer un Digest-Reponse pour le Autorisation Champ d'en-tête de demande 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 le Digest-Réponse Les paramètres sont calculés. En particulier, vous aurez probablement besoin d'une implémentation MD5 car c'est le plus couramment utilisé algorithme pour ce schéma d'authentification.
Voici une simple jetonisation que vous pouvez commencer avec:
var ws = '(?:(?:\\r\\n)?[ \\t])+',
token = '(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2E\\x30-\\x39\\x3F\\x41-\\x5A\\x5E-\\x7A\\x7C\\x7E]+)',
quotedString = '"(?:[\\x00-\\x0B\\x0D-\\x21\\x23-\\x5B\\\\x5D-\\x7F]|'+ws+'|\\\\[\\x00-\\x7F])*"',
tokenizer = RegExp(token+'(?:=(?:'+quotedString+'|'+token+'))?', 'g');
var tokens = xhr.getResponseHeader("WWW-Authentication").match(tokenizer);
Cela allumera A www-authentifier champ d'en-tête 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 analyser les paramètres (Vérifier l'existence et la validité) et extraire les valeurs. Notez que cited-string Les valeurs peuvent être pliées, vous devez donc les déranger (voir aussi l'utilisation de la fonction _ unq
dans le RFC):
function unq(quotedString) {
return quotedString.substr(1, quotedString.length-2).replace(/(?:(?:\r\n)?[ \t])+/g, " ");
}
Avec cela, vous devriez être capable de mettre en œuvre cela seul.
Il est possible avec Vanilla JavaScript. Essayez digestauthrequest.js:
Vous devriez essayer le plugin digestj jquery.
http://code.google.com/p/digestj/
C'est une implémentation partielle mais pourrait être suffisante pour vous aider à traverser.