web-dev-qa-db-fra.com

L'authentification digère est-elle possible avec jQuery?

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>
30
Mitciv

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:

  1. le client envoie une demande de ressource protégée d'accès, mais un fichier acceptable autorisation Le champ d'en-tête n'est pas envoyé
  2. le serveur répond avec un code d'état "401 non autorisé" et a www-authentifier champ d'en-tête (le Digest-Challenge)
  3. client envoie une autre demande pour la même ressource, mais contenant a autorisation champ d'en-tête en réponse au défi (The Digest-Réponse)
  4. si l'autorisation n'a pas de succès, passez à l'étape 2; Sinon, le serveur se déroule comme normal.

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.

48
Gumbo

Il est possible avec Vanilla JavaScript. Essayez digestauthrequest.js:

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

4
inorganik

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.

3
Jerome WAGNER