nodejs实现登录认证功能--使用session方式

这篇博客详细介绍了如何用Node.js处理登录验证。通过查询数据库校验用户名和密码,成功登录后,利用随机生成的suid保存用户信息到Redis,并设置HTTP Only的Cookie。同时,还提供了测试接口来展示如何获取登录用户的username。

在这里插入图片描述

具体详细的代码可以看我的个人github

校验登录信息

// 命中登录路由
function loginRouter(req, res) {
  const promsie = new Promise((resolve, reject) => {
    if(req.path === '/api/user/login') {
      // 拿到password, username
      const { password, username } = req.body
      // 查询数据库
      login(username, password).then(result => {
        if(result) {
          resolve({username}, new SuccessModel('登录成功'))
        }
      }).catch(err => {
        reject(new ErrorModel('登录失败'))
      })
    }
  })
  return promsie
}

// 查询数据库业务处理逻辑
const login = (username, password) => {
  const sql = `select username, realname from users where password='${password}' and username='${username}'`
  return exec(sql).then(rows => {
    return rows[0] || {}
  })
}

保存用户信息,设置cookie

if(req.path === '/api/user/login') {
 const { password, username } = req.query
  login(username, password).then(result => {
    if(result.username) {
      let suid = req.cookie.suid || ''
      if(suid === '') {
        const session = {
          username: result.username,
           realname: result.realname
         }
         // 随机生成一个suid
         suid = `${Date.now()}_${Math.random()}`
         console.log(session)
         // 登录成功,存用户信息到redis
         set(suid, session)
         // 设置cookie
         res.setHeader('Set-Cookie', `suid=${suid}; path=/; httpOnly; expires=${getCookieExpires()}`)
       }
       resolve(new SuccessModel('登录成功'))
     } else {
       reject(new ErrorModel('密码错误'))
     }
   }).catch(err => {
     reject(new ErrorModel('登录失败'))
   })
 }

测试接口

if(req.path === '/api/user/test') {
  console.log(req.session.username)
  resolve(
    new SuccessModel({
      username: req.session.username
    })
  )
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值