jquery digest-authentication

¿Es posible la autenticación Digest con jQuery?



digest-authentication (3)

Estoy intentando enviar una solicitud que requiere autenticación HTTP Digest.

¿Es posible el compendio en jQuery?

Si es así, ¿está esto cerca de la forma correcta de hacerlo? Actualmente no está funcionando.

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




No, el Esquema de autenticación de acceso implícito es un poco más complejo, ya que implementa un mecanismo de autenticación de desafío-respuesta que requiere los siguientes pasos:

  1. el cliente envía una solicitud de un recurso protegido por acceso, pero no se envía un campo de encabezado de autorización aceptable
  2. el servidor responde con un código de estado "401 no autorizado" y un campo de encabezado autenticado WWW (el desafío de resumen )
  3. el cliente envía otra solicitud para el mismo recurso pero que contiene un campo de encabezado de Autorización en respuesta al desafío (la respuesta-resumen )
  4. si la autorización no tiene éxito, vaya al paso 2; de lo contrario, el servidor procede de la forma normal.

Esto significa que hay al menos dos pares de solicitud / respuesta.

Cada campo de encabezado de respuesta Autenticación WWW tiene la sintaxis:

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

Por lo tanto, debe analizar el desafío de resumen para obtener los parámetros para poder generar una respuesta de resumen para el campo de encabezado de solicitud de autorización con la siguiente sintaxis:

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

Esa sección también describe cómo se calculan los parámetros de digestión-respuesta . En particular, probablemente necesitará una implementación MD5, ya que es el algoritmo más utilizado para este esquema de autenticación.

Aquí hay una tokenización simple con la que puedes comenzar:

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

Esto activará un campo de encabezado WWW-Authenticate como:

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

dentro:

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

Luego necesita analizar los parámetros (verificar la existencia y la validez) y extraer los valores. Tenga en cuenta que los valores de cadena entre comillas se pueden plegar, por lo que necesita desplegarlos (vea también el uso de la función unq en el RFC):

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

Con esto deberías poder implementarlo por tu cuenta.