[Registro tres] Vue + nodo + koa2 + mysql + nginx + redis, desarrollo de pila completa de pequeños programas y sistema de gestión de administrador proyectos-verificación de token estado de inicio de sesión

Todos los proyectos que involucran el inicio de sesión y el registro del usuario necesitan un estado de inicio de sesión para verificar el estado de inicio de sesión del usuario. Los escritorios de inicio de sesión de uso común no son más que tokens, sesiones y otros identificadores. Aquí estoy usando el campo token. El token generalmente contiene la información personal del usuario, como el número de cuenta, la identificación de la cuenta, el nombre de usuario, etc. Es más seguro agregar una sal personalizada (salt) y cifrarla para evitar la fuga de información del usuario. Usémoslo juntos:

Hablando de tokens, definitivamente pensaría en cómo el back-end sabe si el token que me dio el front-end es el valor válido que le pasé. Es decir, el backend debe tener un valor para comparar con el token pasado por el frontend para conocer la validez. Por lo tanto, cuando el backend genera el token, también necesita guardar el token generado para su uso. Elegí redis aquí. Es una base de datos, almacenada en forma de pares clave-valor, de modo que puedo almacenar los tokens generados. En cuanto a la instalación y despliegue de redis, no es engorroso aquí y se utilizará directamente aquí.
Cree una carpeta redis en el directorio raíz del proyecto. Cree un archivo redis.js debajo de él.

//redis.js
const Redis = require('ioredis')//导入模块
const redis = {
    
    
    port: 6379,          // Redis port
    host: '127.0.0.1',   // Redis host
    prefix: '***', //存诸前缀
    ttl: 60 * 60 * 24 * 7 * 1000,  //过期时间   
    family: 4,
    db: 0
}
const redisClient = new Redis(redis)
//导出备用
module.exports = redisClient

Entonces se puede usar redis.

Este artículo utiliza jsonwebtoken para el cifrado y descifrado.
Debido a que el cifrado y el descifrado son cosas que muchas interfaces necesitan usar, escribo estos métodos para la parte pública.
Un common.js se crea en el archivo utils para almacenar métodos públicos.

//common.js
const secret = require('./secret')//导入自定义的盐
const jwt = require('jsonwebtoken')//导入jsonwebtoken
const verify = util.promisify(jwt.verify) // token解密
const common = {
    
    //定义一个对象
  //加密
  //后端生成唯一的key
  /*
  * paylod:包含来用户的信息
  * secret.secret 自定义的盐(salt)
  * expiresIn 设置这个token的有效期
  */
  //jwt.sign是jsonwebtoken模块的一个方法,可以将传入的信息加密
  getToken(paylod, expiresIn) {
    
    
    return jwt.sign(paylod, secret.secret, expiresIn)
  },
  //解密
  //根据收到的token获取用户信息
  getUserInfo(token) {
    
    
    return verify(token, secret.secret) 
  },
}
//导出这个对象给外部使用
module.exports=common

Cree un nuevo archivo secret.js para almacenar información personalizada

Inserte la descripción de la imagen aquí
⚠️ Aquí se recomienda que la sal se escriba de manera aleatoria, mejor, y se deben agregar y escribir desordenados todo tipo de caracteres.

cifrado

Ciframos la información del usuario cuando el usuario inicia sesión correctamente. Así que escribo en mi interfaz de inicio de sesión de administrador.

Mi archivo admin.js en el archivo de rutas

//admin.js
const router = require('koa-router')()
const api = require('../controllers/api')
const redisClient = require('../redis/redis.js')
const common = require('../util/comon')

router.prefix('/admin')
//管理员登录
router.post('/userLogin', async (ctx, next) => {
    
    
	/*写你的接口逻辑*/
	//定义一个用户信息对象
	const paylod = {
    
    
        name: '登录用户的用户名',
        userid: '登录用户的id',//登录时可查表查拿到用户id
        author: '[email protected]',
        type:'***',
        timestamp: new Date()//加个时间戳保证加密后token的唯一性
    }
    
    /*核心代码*/
    
    // 调用上面公共的token加密方法(注:这里是没有传盐进去的,我是直接在common文件引入来盐)
    // expiresIn设置token的有效期是7天
    const token = await common.getToken(paylod, {
    
     expiresIn: '7 days' })
    //每次登录之前先清除掉所有的有关此用户的key(根据用户id)
    let preToken = await redisClient.get(result.userid)
    //这个preToken就是当初登录时redis存下来的key
    await redisClient.del(preToken)
    //用token作为key、自定义的token前缀+token作为值 传key给前端作为校验
    await redisClient.set(token, secret.identif + token)
    //再生成一对键值对 用来记录是属于哪个用户的token 用户id作为key 传给前端的token(上一条键值对的key)作为值
    await redisClient.set(result.userid,token)
    ctx.body = {
    
    
        status: 200,
        code: 200,
        message: '登录成功',
        data: result,
        token: token//将token传给前端
    }
}

De esta manera, después de que el inicio de sesión sea exitoso, el front-end puede recibir el token único generado por el back-end, y también generé dos pares de pares clave-valor. Un par usa el token como clave y un prefijo de token personalizado como valor; un par usa el ID de usuario como clave y el token como valor. Obtenga la identificación de usuario cuando el usuario inicie sesión, borre el registro con esta identificación de usuario como clave en redis y luego guarde un registro con el token como clave. De esta manera, se puede garantizar que cada vez que un usuario inicia sesión, el usuario solo tenga una clave legal (el llamado estado de inicio de sesión de la misma cuenta en varios lugares desplazará el estado de inicio de sesión de otras personas).

Descifrar

Una vez que se completa el cifrado, la solicitud del cliente debe traer el token de estado de inicio de sesión para manipular los datos, pero es imposible transmitir los datos del usuario en el lado del cliente, lo cual es demasiado inseguro, por lo que los datos a los que agregué la información del usuario al generar el token anterior Útil, siempre que lo descifre, puedo conocer la información del usuario que lleva este token. Este cliente de token no conoce la información del usuario cuando la ve, por lo que es relativamente más seguro.

En common.js, escribí un token que se pasa desde el front-end (se pasa a través del encabezado de la solicitud, no en forma de parámetros)

//common.js
 //根据请求头的信息获取前端传入的token
 getHeaderToken(ctx) {
    
     
   if (ctx.header && ctx.header.token) {
    
     
     return ctx.header.token
   }
 }
const common = require('../util/comon')
//删除管理员
router.post('/****', async (ctx, next) => {
    
    
	let token = await common.getHeaderToken(ctx)
	let userInfo = await common.getUserInfo(token)
	//用户名
	console.log(userInfo.name)
	//用户id
	console.log(userInfo.userid)
}

Por lo tanto, siempre que el front-end pase en el token, el back-end puede conocer la información del usuario transportada por el token, lo que facilita las condiciones necesarias para que el back-end procese los datos.

Lo anterior es esta introducción al uso de tokens, y lo siguiente presenta la solicitud de permisos basados ​​en la interfaz de control de la consola de inicio de sesión.

Anterior: Escribir enrutamiento de interfaz
Siguiente: Permisos de interfaz de control de tokens

Supongo que te gusta

Origin blog.csdn.net/Smell_rookie/article/details/108704245
Recomendado
Clasificación