Возможно ли аутентификация дайджеста с помощью jQuery?

Я пытаюсь отправить запрос, требующий аутентификации HTTP Digest.

Возможно ли дайджест в jQuery?

Если это так, это близко к правильному пути? В настоящее время он не работает.

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

Ответ 1

Нет, Схема аутентификации Digest Access немного сложнее, поскольку она реализует механизм проверки запроса-ответа, который требует следующих шагов:

  • клиент отправляет запрос на ресурс, защищенный доступом, но допустимое поле заголовка полномочий не отправляется
  • сервер отвечает кодом статуса 401 Unauthorized и поле заголовка WWW-Authenticate (вызов дайджест) Клиент
  • отправляет другой запрос для того же ресурса, но содержит поле заголовка авторизации в ответ на вызов (дайджест-ответ)
  • Если авторизация не выполнена успешно, перейдите к шагу 2; в противном случае сервер будет работать как обычно.

Это означает, что есть как минимум две пары запроса/ответа.

Каждое поле заголовка ответа WWW-Authenticate имеет синтаксис:

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

Итак, вам нужно проанализировать вызов digest, чтобы получить параметры, чтобы иметь возможность генерировать ответ дайджест для поля заголовка запроса авторизации со следующим синтаксисом:

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

В этом разделе также описывается, как рассчитываются параметры дайджест-ответ. В частности, вам, вероятно, понадобится реализация MD5, поскольку это наиболее часто используемый алгоритм для этой схемы аутентификации.

Вот простой токениз, который вы можете начать с:

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);

Это заголовок поля заголовка WWW-Authenticate, например:

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

в

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

Затем вам нужно проанализировать параметры (проверить существование и срок действия) и извлечь значения. Обратите внимание, что значения кавычек могут быть свернуты, поэтому вам нужно развернуть их (см. Также использование функции unquote unq в RFC):

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

С этим вы сможете реализовать это самостоятельно.

Ответ 3

Вы должны попробовать плагин digestj jquery.

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

Это частичная реализация, но может быть достаточно, чтобы помочь вам пройти.