[Node.js] Autenticación de identidad, Cookie y mecanismo de autenticación de sesión, usar autenticación de sesión y autenticación JWT en express

modelo de desarrollo web

  • Modelo de desarrollo web tradicional basado en renderizado de servidor
  • El concepto de representación del lado del servidor es que la página HTNL enviada por el servidor al cliente es generada dinámicamente por el servidor a través del empalme de cadenas. Por lo tanto, el cliente no necesita tecnologías como Ajax para solicitar datos de página adicionales.

ventaja:

  • El front-end lleva menos tiempo, lo que es bueno para el SEO (es decir, es más fácil para los rastreadores rastrear y obtener información, lo que es más propicio para el SEO)

defecto:

  • Al ocupar los recursos del servidor, demasiadas solicitudes ejercerán presión sobre el servidor
  • No es propicio para la separación de los extremos delantero y trasero, y la eficiencia de desarrollo es baja
//服务器通过字符串的拼接,发送给前端
app.get("/user", function (req, res) {
    
    
	const user ={
    
    name:'乞力马扎罗',age:'24'}
    // res.send()方法,可以把处理好的json内容,发送给客户端
    res.send(`<h1>姓名:${
      
      user.name},年龄:${
      
      user.age}`)
})
  • Un nuevo modelo de desarrollo web basado en la representación de separación de front-end y back-end
  • Modelo de desarrollo de dos puntos con separación delantera y trasera, que se basa en la amplia aplicación de la tecnología Ajax
  • Es decir, el backend solo es responsable de proporcionar la interfaz API, y el frontend llama al modo de desarrollo de la interfaz Ajax.

ventaja:

  • La experiencia de desarrollo es buena, el front-end se enfoca en las páginas de la interfaz de usuario y el back-end se enfoca en el desarrollo de Api
  • Buena experiencia de usuario, Ajax puede lograr fácilmente una actualización parcial de la página
  • Presión de renderizado reducida en el lado del servidor

defecto:

  • No es propicio para el SEO, porque la página HTML completa debe unirse dinámicamente en el lado del cliente, por lo que el rastreador no puede extraer la información efectiva de la página (la solución, utilizando tecnología SSR de front-end como vue, React, etc. ., puede resolver este problema muy bien)
Cómo elegir un modelo de desarrollo web
  • Por ejemplo, un sitio web de nivel empresarial cuya función principal es mostrar sin una interacción compleja y requiere un buen SEO, entonces se requiere la representación del lado del servidor
  • Similar a los proyectos de administración en segundo plano, es altamente interactivo y no necesita considerar el SEO, por lo que puede usar el modo de desarrollo de separación de front-end y back-end.
  • Por supuesto, a veces, para tener en cuenta la velocidad de renderizado de la página de inicio y la eficiencia de desarrollo de la separación de front-end y back-end, algunos sitios web adoptan el modo de desarrollo de renderizado de servidor de primera pantalla + front-end y back-end. separación de otras páginas

Autenticación

¿Qué es la autenticación de identidad?
  • La autenticación de identidad, también conocida como verificación y autenticación de identidad, se refiere a la confirmación de la identidad del usuario a través de ciertos medios.
  • En el desarrollo web, la autenticación de la identidad del usuario está involucrada. Por ejemplo, inicio de sesión con código de verificación de teléfono móvil, inicio de sesión con contraseña de correo electrónico, inicio de sesión con código QR de los principales sitios web
¿Por qué la autenticación?
  • El propósito de la autenticación de identidad es confirmar que el usuario que actualmente afirma tener una determinada identidad es de hecho el usuario reclamado,
  • Del mismo modo, al recoger el mensajero, saque su código de recogida o número de teléfono móvil
Autenticación para diferentes modos de desarrollo

Dos modos de desarrollo basados ​​en la representación del servidor y la separación de front-end y back-end, cada uno con diferentes esquemas de autenticación

  • Se recomienda utilizar el mecanismo de autenticación de sesión para la representación del lado del servidor
  • Se recomienda utilizar el mecanismo de autenticación JWT para la separación de front-end y back-end

Mecanismo de autenticación de sesión

Comprender la apatridia del protocolo HTTP
Significa que cada solicitud http del cliente es independiente, no existe una relación directa entre varias solicitudes consecutivas y el servidor no conservará activamente el estado de cada solicitud HTTP.
Similar a los cajeros de los supermercados que no pueden recordar si cada cliente que viene a pagar es un VIP
Cómo superar la limitación sin estado de HTTP
Cuando el cliente inicia sesión con éxito, el servidor emite un inicio de sesión exitoso para el cliente, de modo que cuando el cliente inicia sesión por segunda vez, puede llevar este logotipo (cookie) para decirle al servidor que ya he iniciado sesión antes.
Al igual que los supermercados que manejan las tarjetas de membresía para los clientes, el cajero usa la tarjeta de membresía para confirmar si el cliente es VIP.
  • El método de autenticación de la tarjeta de membresía en la vida real, el término profesional en desarrollo web se llama Cookie
que son las galletas
1. Una cookie es una cadena de caracteres almacenada en el navegador del usuario que generalmente no supera los 4 Kb. Consta de un nombre (Name), un valor (Value) y varias otras opciones para controlar el período de validez, la seguridad y el alcance del uso. de la composición de los atributos de la cookie.
2. Las cookies bajo diferentes nombres de dominio son independientes Cada vez que el cliente inicia una solicitud , todas las cookies no caducadas bajo el nombre de dominio actual se enviarán automáticamente al servidor juntas.
inserte la descripción de la imagen aquí
Varias características de las cookies
Enviado automáticamente, automáticamente según lo solicitado
El nombre de dominio es independiente y Baidu no puede acceder a las cookies en Taobao
Límite de tiempo de caducidad, cada cookie tiene una fecha de caducidad, después de la cual no se volverá a enviar
Límite de 4kb, cada cookie no puede exceder los 4kb
El papel de las cookies en la autenticación de identidad
1. Cuando el cliente solicita el servidor por primera vez, el servidor envía una cookie de autenticación al cliente en forma de encabezado de respuesta
2. El cliente guardará automáticamente la cookie en el navegador
3. Posteriormente, cada vez que el navegador del cliente solicite al servidor, el navegador enviará automáticamente todas las cookies relacionadas con la autenticación de identidad al servidor en forma de encabezados de solicitud.
4. El servidor puede verificar la identidad del cliente

inserte la descripción de la imagen aquí

Las cookies no son seguras
Debido a que las cookies se almacenan en el navegador, y el navegador también proporciona API para leer y escribir cookies, las cookies son fáciles de falsificar y no son seguras.
Por lo tanto, no se recomienda que el servidor envíe datos privados importantes al navegador en forma de cookies.
Por lo tanto, nunca use cookies para almacenar datos importantes y privados, como información de identidad de usuario y contraseñas.
Mejorar la seguridad de la autenticación de identidad
  • Del mismo modo, para evitar que los clientes falsifiquen las tarjetas de membresía, el cajero puede deslizar la tarjeta para la autenticación en la caja registradora después de recibir la tarjeta de membresía presentada por el cliente. Solo la tarjeta de membresía confirmada por la caja registradora se puede usar normalmente, es decir , tarjeta de membresía + pase de tarjeta certificado
  • El concepto de 'tarjeta de membresía + autenticación de tarjeta' es la esencia del mecanismo de autenticación de Session
Cómo funcionan las sesiones

inserte la descripción de la imagen aquí

Uso de la autenticación de sesión en Express

  • Instale el middleware Express-session, npm i express-session

En el proyecto Express, solo necesita instalar el middleware para usar la autenticación de sesión en el proyecto

  • Configurar el middleware de sesión rápida

Después de que el middleware de sesión rápida se haya instalado correctamente, debe registrar el middleware de sesión a través de app.use()

//express-session中间件
//导入session中间件
const session = require('express-session')
//注册session
app.use(session({
    
    
    secret: "key", //值,负责对session加密
    resave: false, //固定写法
    saveUninitialized: true, //固定写法
}))
  • Guardar datos en la sesión
  • Después de que la configuración sea exitosa, se puede acceder y usar el objeto de sesión a través de req.session para almacenar la información clave del usuario.
  • Solo cuando se configura el middleware de sesión rápida, se puede mostrar el atributo de sesión a través de req
  • Si la solicitud de publicación, configure esta aplicación. use (express.urlencoded ({extended: false})), de lo contrario, la solicitud de publicación está vacía
//express-session中间件
//导入session中间件
const session = require('express-session')
// 导入express
const express = require('express')
// 创建web服务器
const app = express()
// 启动文本服务器
app.listen(80,()=>{
    
    
    console.log("80服务器启动")
})
//注册session
app.use(session({
    
    
    secret: "key", //值,负责对session加密
    resave: false, //固定写法
    saveUninitialized: true, //固定写法
}))
//配置这个,不然post请求是空
app.post('/login', (req, res) => {
    
    
    if (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {
    
    
        return res.send({
    
    
            'status': 0,
            msg: "登录失败"
        })
    }
    //只有配置了express-session这个中间件,才能通过req点出来session这个属性
    //通过 req.session追加任何属性
    req.session.user = req.body
    req.session.islogin = true
    res.send({
    
    
        'status': 1,
        msg: "登录成功"
    })
})

  • Obtener datos de la sesión
//向session中取数据 
app.post('/getuserinfo', (req, res) => {
    
    
    console.log(req.session.user)
    // 判断用户是否登录
    if (!req.session.islogin) {
    
    
        res.send({
    
    
            'status': 0,
            msg: "请登录"
        })
        return
    }
    res.send({
    
    'status':1, data:req.session.user})
})
  • sesión clara
  • Llame a la función req.session.destroy() para borrar la información de la sesión guardada por el servidor.
  • Solo borrará la información de la sesión del usuario actual que usa esto, en lugar de borrar toda la información de la sesión.
  • Llame a la escena, cierre la sesión
app.post('/outlogin', (req, res) => {
    
    
    req.session.destroy()
    res.send({
    
    'status':1, msg:'退出成功'})
})
Limitaciones del mecanismo de autenticación de sesión
  • El mecanismo de autenticación de sesión debe cooperar con Cookie para realizar
  • Dado que las cookies no admiten el acceso entre dominios de forma predeterminada, cuando se trata de solicitudes de front-end entre dominios a interfaces de back-end, se requiere una gran cantidad de configuración adicional.
  • Para lograr la autenticación de sesión entre dominios
  • Aviso:
  • Cuando el front-end solicita la interfaz de back-end y no hay un problema entre dominios, se recomienda utilizar el mecanismo de autenticación de sesión.
  • Cuando el front-end necesita solicitar la interfaz de back-end entre dominios, no se recomienda usar el mecanismo de autenticación de Seesion y se recomienda usar el mecanismo de autenticación de JWT.

Mecanismo de autenticación JWT

JWT, nombre completo: JSON Web Token, es actualmente la solución de autenticación entre dominios más popular

Cómo funcionan los JWT

inserte la descripción de la imagen aquí

Componentes de JWT
  • JWT generalmente consta de tres partes, a saber, Encabezado (cabeza), Carga útil (carga útil), Firma (firma)
  • Los tres están conectados por los ingleses.
  • Formato: Encabezado.Carga útil.Firma
  • La parte de carga útil es la información real del usuario, que es una cadena generada después de cifrar la información del usuario.
  • La parte del encabezado y la parte de la firma son partes relacionadas con la seguridad, solo para garantizar la seguridad del token.
  • La ruta de solicitud que comienza con /api no requiere derechos de acceso
  • La ruta de la solicitud que comienza con /my necesita llevar la autenticación de identidad de autorización en el encabezado de la solicitud, para que el acceso normal pueda tener éxito.
Authorization: Bearer <token>

Usando JWT en Express

  • Instalar paquetes relacionados con JWT
npm install jsonwebtoken express-jwt
  • jsonwebtoken se usa para generar una cadena JWT
  • express-jwt se usa para analizar y restaurar cadenas JWT en objetos JSON
  • paquete de importación
const jwt = require("jsonwebtoken")
const expressjwt = require("express-jwt")

Definir la clave secreta

  • Para garantizar la seguridad de la cadena JWT y evitar que otros descifren el JWT durante la falla de transmisión de la red, debemos definir una clave Secert para el cifrado y descifrado.
  • Al generar la cadena JWT, debe usar la clave secreta para cifrar la información del usuario y, finalmente, esperar hasta que la cadena JWT cifrada
  • Al analizar y restaurar la cadena JWT en un objeto JSON, se requiere la clave serect para el descifrado
Generar cadena JWT después de un inicio de sesión exitoso
const jwt = require("jsonwebtoken")
const {
    
    expressjwt} = require("express-jwt")
//定义secret秘钥,
const secretKey="adminpossword"
app.post('/jwtlogin', (req, res) => {
    
    
	let user=req.body
    if (req.body.name !== '乞力马扎罗' || req.body.password !== '111111') {
    
    
        return res.send({
    
    
            'status': 0,
            msg: "登录失败"
        })
    }
    //调用jwt.sign()生成JWT字符串,三个参数分别是,用户信息对象,加密秘钥,配置对象(expiresIn代表token有效期)
    res.send({
    
    
        'status': 1,
        msg: "登录成功",
        token:jwt.sign(user,secretKey,{
    
    expiresIn:'30s'})
    })
})

inserte la descripción de la imagen aquí

Revertir cadena JWT a objeto JSON
  • Cada vez que el cliente accede a una interfaz autorizada, debe pasar activamente el campo AUthirization en el encabezado de la solicitud para enviar la cadena del token al servidor para su autenticación.
  • En este momento, el servidor analiza y restaura automáticamente el token enviado por el cliente en un objeto JSON a través del middleware express.Jwt
// 1,使用app.use()注册
// 2,expressjwt({secret:secretKey})就是用来解析的中间件
// 3,.unless({path:[/^\/api\//]})用来指定哪些接口不需要访问权限
//4,algorithms:['HS256']必写
// 配置过 express-jwt 可通过 req.auth 获取token信息
app.use(expressjwt({
    
     secret: secretKey, algorithms: ["HS256"] }).unless({
    
     path: [/^\/api\//]}))

Acceda a la información del usuario analizada desde la cadena JWT a través del objeto req.user
  • Encabezado de solicitud de configuración Autorización: Portador+espacio+token después de iniciar sesión
  • El app.use anterior (expressjwt ({ secreto: clave secreta, algoritmos: [“HS256”] }). a menos que ({ ruta: [/^/api//]})) debe configurarse globalmente antes de acceder
app.post('/getuser', (req, res) => {
    
    
    console.log(req.user) 
    res.send({
    
    
        status: 1,
        msg: "成功",
        data:req.auth
    })
}) 

inserte la descripción de la imagen aquí

Errores de captura generados después de que falla el análisis de JWT
  • Verifique que el token esté caducado o sea ilegal, y capture este problema a través del middleware de error expreso
  • El middleware de error debe colocarse después de todas las rutas
//错误中间件
app.use((err, req, res, next) => {
    
    
    console.log(err)
    if (err.name === 'UnauthorizedError') {
    
    
        return res.send({
    
    
            status: 401,
            message: "无效token"
        })
    }
    res.send({
    
    
        status: 500,
        message: "未知错误"
    })
})

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44899940/article/details/129265824
Recomendado
Clasificación