En la lección de hoy vamos a comenzar con la más básica, la autenticación HTTPEl HTTP (Hyper Text Transfer Protocol) es un protocolo que se usa para transmitir datos en redes. HTTP es un estándar técnico generalmente aceptado que establece cómo un cliente web se comunica con un servidor para que los datos solicitados por el cliente puedan ser cargados y mostrados. Información general Junto con el URL y el HTML, HTTP es uno de los conceptos más importantes de Internet (www). Fue desarrollado más básica, continuaremos con las cookies y los tokens , y terminaremos con firmas y contraseñas de un solo uso. Sigue leyendo para que aprendas todo acerca de esto.
Autenticación básica HTTP
La autenticación HTTP básica es un método para que el cliente proporcione un nombre de usuario y una contraseña al realizar una solicitud.
Esta es la forma más sencilla posible de imponer el control de acceso, ya que no requiere cookies, sesiones o cualquier otra cosa. Para usar esto, el cliente debe enviar la Authorization junto con cada solicitud que realice. El nombre de usuario y la contraseña no están cifrados, pero se construyen de esta manera:
El nombre de usuario y la contraseña se concatenan en una sola cadena: username:password esta cadena está codificada con Base64
La palabra clave Basic se coloca antes de este valor codificado
Ejemplo para un usuario nombrado juan con contraseña con secreta:
curl --header "Authorization: Basic am9objpzZWNyZXQ=" my-website.com
Implementarlo también es bastante fácil en Node.js: el siguiente fragmento de código muestra cómo puedes hacer un middleware Express para hacerlo.
import basicAuth from 'basic-auth';
function unauthorized(res) {
res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
return res.send(401);
};
export default function auth(req, res, next) {
const {name, pass} = basicAuth(req) || {};
if (!name || !pass) {
return unauthorized(res);
};
if (name === 'juan' && pass === 'secreta') {
return next();
}
return unauthorized(res);
};
Por supuesto, puedes hacerlo en un nivel superior, como en nginx .
Parece simple, ¿verdad? Entonces, ¿cuáles son los inconvenientes de usar la autenticación HTTP básica ?
Los contras:
- El nombre de usuario y la contraseña se envían con cada solicitud, exponiéndolos potencialmente, incluso si se envían a través de una conexión segura conectado a SSLLa encriptación SSL (Secure Socket Layer) proporciona una conexión segura entre el cliente y el servidor. Consiste en un protocolo de Internet que permite encriptar datos sensibles (como información de pago, datos de tarjetas de crédito) y hacerlos ilegibles a terceros. Al mismo tiempo, un certificado confirma que el servidor es fiable. En este momento, además se le llama TLS (Transport Layer Security). Relevancia SSL es un método de cifrado más / TLS, si un sitio web utiliza un cifrado débil o un atacante puede romperlo,
- Los nombres de usuario y las contraseñas se expondrán de inmediato no hay manera de cerrar la sesión del usuario usando la autenticación básica, la caducidad de las credenciales no es trivial: debe pedirle al usuario que cambie la contraseña para hacerlo.
Cookies
Cuando un servidorLos servidores son ordenadores centrales y potentes dentro del campo de la tecnología de la información que procesan y proporcionan software y archivos en una red. Desde el punto de vista de un cliente, varios ordenadores en una red pueden ponerse en contacto con el servidor central para conseguir la información solicitada. En la arquitectura cliente-servidor, el servidor puede ser un software que proporciona un servicio y se ejecuta en más recibe una solicitud HTTP en la respuesta, puede enviar un encabezado Set-Cookie. El navegadorUn navegador (además: browser) es una herramienta informática que te permite ver documentos y datos y navegar por la red. Los navegadores pueden mostrar distintos tipos de recursos de información; principalmente documentos HTML, a pesar de todo, además son posibles otros tipos de archivos y contenido multimedia, como PDF, JPEG, MPEG, GIF o el lenguaje de meta marcado. A través el uso de complementos especiales y la configuración respectivo, los más lo coloca en un contenedor de cookies, y la cookieUna cookie es un registro que es almacenado por un servidor web en el disco duro del usuario. El archivo recibido es una combinación de caracteres formada por números y letras, que asigna una cierta identidad al usuario (cliente). No podrán exceder un tamaño máximo de 4 KB y contendrán, por ejemplo, información sobre la extensión de la visita o sobre lo que el usuario haya pulsado. Cuando el cliente más se enviará junto con cada solicitud realizada al mismo origen en el encabezado Cookie HTTP.
Para utilizar las cookies con fines de autenticación, hay algunos principios clave que se deben seguir.
Siempre use las cookies de HttpOnly
Para mitigar la posibilidad de ataques XSS, siempre use la bandera HttpOnly al configurar las cookies. De esta manera no aparecerán en document.cookies.
Siempre usa cookies firmadas
Con las cookies firmadas, un servidor puede saber si el cliente modificó una cookie.
Más adelante, todas las solicitudes utilizan las cookies establecidas para el dominioUn dominio es una sección de Internet con direcciones que comparten un sufijo común o están bajo el control de una organización o individuo en particular. Está organizado jerárquicamente. Tanto los objetos físicos como los virtuales pueden ser direccionados con el nombre de dominio. Estos objetos pueden ser webs, ordenadores en red o servicios, como impresoras, faxes o servidores de correo. Cada objeto está referenciado por una dirección IP única, más dado:
Uso de cookies de Chrome
Los contras:
- Necesidad de hacer un esfuerzo extra para mitigar los ataques CSRF
- Incompatibilidad con REST, ya que introduce un estado en un protocolo sin estado
Fichas
Hoy en día, JWT (JSON Web Token) está en todas partes; aunque vale la pena echarle un vistazo a los posibles problemas de seguridad.
JWT consta de tres partes:
- Encabezado: que contiene el tipo de token y el algoritmoUn algoritmo es un procedimiento o conjunto de reglas a seguir en los cálculos u otras operaciones de resolución de problemas, fundamentalmente por un PC. Apps Un ejemplo de la vida cotidiana es una receta para hornear un pastel. Siguiendo los pasos de la receta se obtiene el pastel deseado al final. Otras apps conocidas son la búsqueda y clasificación. ¿Cómo se puede hallar un canal de televisión de la más de hash
- Carga útil: conteniendo las reclamaciones.
- Firma: que puede calcularse de la siguiente manera si elige HMAC SHA256: HMACSHA256( base64UrlEncode(headerConcepto de Header¿Qué es el Header?El Header, encabezado en español, es una definición que se usa en el terreno del diseño y la programación web para referirse a la parte de arriba de una página. Se trata del primer punto a ver por cualquier usuario que entra en un portal web, por lo que cuenta con una responsabilidad enorme y ha de contener la carga informativa esencial para mostrar la más) + «.» + base64UrlEncode(payload), secret)
Agregar JWT a las aplicaciones Koa es tan solo un par de líneas de código:
var koa = require('koa');
var jwt = require('koa-jwt');
var app = koa();
app.use(jwt({
secret: 'very-secret'
}));
// Middleware protegido
app.use(function *(){
// el contenido del token estará disponible en this.state.user
this.body = {
secret: '42'
};
});
Ejemplo de uso:
curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" my-website.com
Como los anteriores, los tokens se pueden observar también en Chrome:
Si está escribiendo APIConcepto de API¿Qué es una API?Una API, siglas de Application Programming Interface o Interfaz de Programación de Apps, es un recopilatorio de código que se puede emplear para que varias apps se comuniquen entre ellas. Es algo que realiza una tarea equivalente a la interfaz de usuario al momento de promover la interacción entre persona y programa, solo que aplicado única y exclusivamente dentro del entorno del software.Aún cuando suene más para aplicaciones móviles nativas o SPA, JWT puede ser una buena opción para ti. Una cosa a tener en cuenta: para usar JWT en el navegador, debe almacenarlo en LocalStorage o SessionStorage, lo que puede provocar ataques XSS.
Los contras:
- Necesidad de hacer un esfuerzo extra para mitigar los ataques XSS
Firmas
Ya sea utilizando cookies o tokens, si la capa de transporte por cualquier motivo queda expuesta, sus credenciales son fáciles de acceder, y con un token o cookie el atacante puede actuar como el usuario real.
Una posible forma de resolver esto, al menos cuando hablamos de API y no del navegador, es firmar cada solicitud. ¿Cómo podemos hacerlo?
Cuando un consumidor de una API realiza una solicitud, debe firmarla, lo que significa que debe crear un hash de toda la solicitud mediante una clave privada. Para ese cálculo de hash puedes usar:
- Método HTTP
- Ruta de la solicitud
- EncabezadosConcepto de Encabezados¿Qué son los Encabezados?Los Encabezados, además conocidos como headers en inglés, son una parte fundamental del diseño de cualquier web, dado que consiste en la parte principal que se ve de esta al acceder, la parte de arriba de cualquier página. El lugar más visible y al que todos los usuarios que visitan un lugar de Internet acceden cuando entran en él, pudiendo tener así una imagen rápida más HTTP
- Suma de comprobación de la carga útil HTTP
- y una clave privada para crear el hash
Para que funcione, tanto el consumidor de la API como el proveedor deben tener la misma clave privada. Una vez que tengas la firma, debes agregarla a la solicitud, ya sea en cadenas de consulta o encabezados HTTP. Además, también se debe agregar una fecha, para que pueda definir una fecha de vencimiento.
¿Por qué pasar por todos estos pasos? Porque incluso si la capa de transporte se ve comprometida, un atacante solo puede leer su tráfico, no podrá actuar como usuario, ya que el atacante no podrá firmar solicitudes, ya que la clave privada no está en su poder. La mayoría de los servicios de AWS están utilizando este tipo de autenticación.
node-http-signature se ocupa de la firma de solicitud HTTP y vale la pena consultar.
Los contras:
- No se puede usar en el navegador / cliente, solo entre APIs
Contraseñas de un solo uso
Los algoritmos de contraseñas de un solo uso generan una contraseña de un solo uso con un secreto compartido y la hora actual o un contador:
- Algoritmo de contraseña de un solo uso basado en el tiempo, está basado en la hora actual.
- Algoritmo de contraseña de un solo uso basado en HMAC, está basado en un contador.
Estos métodos se utilizan en aplicaciones que aprovechan la autenticación de dos factores: un usuario ingresa el nombre de usuario y la contraseña, y tanto el servidor como el cliente generan una contraseña de un solo uso.
En Node.js, implementar esto usando notp es relativamente fácil.
Contras:
- Con los tokens de usuario de secreto compartido (si son robados) se pueden emular
- porque los clientes pueden ser robados, todas las aplicaciones en tiempo real tienen métodos para evitar esto, como un restablecimiento de correo electrónico que agrega vectores de ataque adicionales a la aplicación
¿Qué método de autenticación web elegir cuando?
Si solo tienes que admitir una aplicación web, las cookies o los tokens están bien. Para las cookies, piensa en XSRF, para que JWT se encargue de XSS.
Si tienes que admitir una aplicación web y un cliente móvil, usa una API que admita una autenticación basada en algún token.
Si estás creando API que se comunican entre sí, mejor usa la firma de solicitud.





