nodejs登录生成token并验证

目录

一、基础概念

二、JTW

三、实践


 一、基础概念

"token": 是一个通用的术语,指代一种用于表示身份、权限或访问凭证的数据结构。它可以是一个字符串、数字或其他形式的数据。

主要用途:

  1. 身份验证:在身份验证过程中,用户提供凭据(如用户名和密码),服务器验证凭据的有效性后会颁发一个身份验证令牌给用户。这个令牌可以是一个长期有效的持久令牌,也可以是一个短期有效的临时令牌,用于后续的请求中证明用户的身份。

  2. 授权访问:当用户通过身份验证后,服务器可以颁发一个访问令牌给用户。这个令牌用于证明用户被授予了特定的权限或访问特定资源的权利。用户在后续请求中使用该令牌来访问受保护的资源,服务器会验证令牌的有效性和权限。

  3. API 访问:在应用程序开发中,API 令牌通常用于授权第三方应用程序或服务来访问特定的 API。开发者向 API 提供商注册应用程序,并获得一个 API 令牌,以便在应用程序中进行身份验证和授权,以访问和使用 API 提供的功能和数据。

简单来说,就是本次登录的一个凭证,只要你带着服务器端返回来的token你就可以访问当前相对应的内容(具体还需要服务端来定)。

二、JTW

token本身就是一个加密字符串,但是由自己生成需要考虑到安全性、加密算法等,但我们可以使用插件 例如jsonwebtoken就可以帮助我们token并验证。

安装jsonwebtoken

npm install jsonwebtoken

生成token 

语法:JWT.sign(数据,加密字符串, 时间)  

const JWT = require("../../utils/JWT.js")

let token = JWT.sign({ username:'奥特曼',id:123 },'secret', '1day')

验证token 

语法:jwt.verify(生成的token,加密字符串)

jwt.verify(token,'secret')

三、实践

 封装


const jwt = require('jsonwebtoken')
const secret = "ultraman"//解密密钥

const JWT = {
    createToken: (data,time) => { 
        return jwt.sign(data,secret,{expiresIn:time})
    },
    verifyToken: (token) => { 
    // 如果token过期或验证失败,将返回false
       try {
        return jwt.verify(token,secret)
       } catch (error) {
        return false
       }
    }
}

module.exports = JWT

登录接口

 login: async (req, res, next) => { 
        var result = await UserService.login(req.body)
        if (result.length) {
            // 生成token
            const DeepRes = JSON.parse(JSON.stringify(result[0])) 
            delete DeepRes.password
            let token = JWT.createToken({ username: req.body.username,id:result[0]._id }, '1day')
            res.header('Authorization', token)
            res.send({code:200,msg:'登录成功',data:{token,userInfo:DeepRes}})
        } else {
            res.send({code:500,msg:'账号或密码错误'})
        }
        console.log(result,'登陆了');
    },

验证拦截

验证中用了截取,采用了Bearer  xxxx 的形式,所以做了截取只保留token部分进行验证。

app.use((req, res, next) => {  
  if (whiteList.includes(req.path)) return next()

  let token = req.get('Authorization')
  if (token) {
    const result = JWT.verifyToken(token.split(' ')[1])
    if (result) {
      next()
    } else {
      res.status(401).send({ code: 401, msg: '登录信息已失效,请重新登录' })
    }
  } else { 
    res.send({ code: 500, msg: '未携带token' })
  }
  
})

验证后会把数据返回出来,就可以当时生成token传过去的数据,有了数据那么我们就可以自行获取用户信息

token获取个人信息

  getUserInfo: async (req, res, next) => { 
        let token = req.get('Authorization')
        const info = JWT.verifyToken(token.split(' ')[1])
       const userInfo =  await UserService.getProfile(info.id)
        console.log(userInfo, 'userInfo');
        res.send({code:200,msg:'获取成功',data:{userInfo:userInfo[0]}})
    }

 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 是一种运行在服务端的 JavaScript,它可以与数据库交互并构建 Web 应用程序。而 MongoDB 是一种非关系型数据库,它被广泛应用于 Web 开发和大数据处理。 在 Web 应用中,常常需要使用 Token验证用户身份和授权访问。Token 是一种包含用户信息和权限的加密字符串,存储在客户端的浏览器或移动设备上。在 Node.js 中,可以使用第三方库来生成验证 Token,如 jsonwebtoken。 jsonwebtoken 提供了 jwt.sign() 和 jwt.verify() 两个方法。jwt.sign() 方法接受一个对象参数,包含要加密的信息和密钥,返回一个 Token 字符串。例如: ```javascript const jwt = require('jsonwebtoken'); const payload = { username: 'admin', role: 'admin' }; const secretKey = 'mysecret'; const token = jwt.sign(payload, secretKey); console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNjIyMzUyNDMyLCJleHAiOjE2MjI0Mzg4MzJ9.DR1Wb8T78eQD9j0IvB0Gq3i8sMwsvsBj1DndolNws3o ``` jsonwebtoken.verify() 方法接受两个参数,Token 字符串和密钥,如果 Token 验证成功则返回解密后的信息。例如: ```javascript jwt.verify(token, secretKey, (err, decoded) => { if (err) console.log('Token 验证失败'); else console.log('Token 验证成功', decoded); }); ``` 使用 Node.js 和 MongoDB 可以轻松实现 Token 验证和数据库操作。例如,可以在用户登录生成 Token 并存储到数据库,以后每次用户请求时验证 Token 并查询数据库获取用户信息和权限,最终返回相应数据给客户端。这样可以确保用户访问的安全性和减轻服务器压力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值