登录校验

1.前言

  • 登录状态校验:采用Token机制实现无状态认证
  • 登录时:生成Token返回客户端的同时,服务端也存储一份,将来用于主动踢人
  • 校验API时:通过中间件对客户端Token进行解包校验,还有服务端校验

2.密码管理

  • 登陆时,前端明文传输,后端加密后存储(一来通过HTTPS协议,即使数据被拦截也无法轻易读取,二来由服务端负责哈希处理更具安全性和灵活性)
  • 设定密码,使用bcryptjs,对密码进行加密后进行存储
  • 校验密码,使用bcryptjs,拿前端提交的明文密码和数据库已经存储的hash密码进行校验
//引入
const bcrypt = require('bcryptjs');
//生成hash密码
async function hashPassword(password) {
    // 自动生成一个盐,默认因子为10
    const salt = await bcrypt.genSalt(10)

    // 使用盐来哈希密码
    const hashedPassword = await bcrypt.hash(password, salt);
    return hashedPassword;
}

//对比明文密码和已经存储的hash密码进行
const isMatch = await bcrypt.compare("登陆时的明文密码", "已经存储的hash密码进行")
  • 生成hash密码时,需要用到salt,比对密码时,不需要salt了吗?:bcrypt 在生成哈希值时,会将使用的salt含在最终的哈希字符串中, 所以比对密码时,不再需要salt

3.token管理

  • 生成token:登录成功后,根据用户id和过期信息来生成token,并将token存入数据库,然后返回给前端
  • 前端接收:前端接收token,并进行存储,每次发起请求则带上这个token
  • 校验token:后端处理请求前,对token进行解包处理,得到原信息,再核对数据库的token队列校验是否通过
  • 删除token:用户修改密码后,需要将之前已经下发的token进行失效处理,这也是为什么将token存入数据库的原因之一,单靠jwt是不够的
  • 生成token的库:jsonwebtoken
//token管理工具
var jwt = require('jsonwebtoken')
//密钥
var privateKey = "xxx"

//模拟登录信息
var loginData = {
    id: 1,
    password: "123456"
}

//模拟登录成功(校验密码环节省略)

//生成token返回(包含人员信息和过期信息)
var token = jwt.sign({
    userId: loginData.id,//人员id
    expires: 1737092833417,//过期时间,这里应该动态生成
}, privateKey)
//eyJhbGciOiJIUzI1NiJ9.MTIzNDU2.6j-7-PqBNNVHeOYuI5L4lmSX7rDudiuH-ejSWriUb1g
console.log(token)
//将token存到数据库,再后端添加控制
var tokenList = []
tokenList.push(token)


//后期请求接口,解析token
try {
    //解包token,拿到用户信息和过期时间 { userId: 1, expires: 1737092833417, iat: 1737092957 }
    var decoded = jwt.verify(token, privateKey)
    //拿到用户id,从数据库中查询该用户id对应的token
    //如果不存在,则说明该token已经失效
    //如果存在,则校验是否已经过期
} catch (error) {
    //无效的token进入这里
    console.log('token校验失败')
}
posted @ 2025-01-17 14:09  ---空白---  阅读(47)  评论(0)    收藏  举报