Node.js 的token和鉴权的使用

在Node.js中,鉴权(Authentication)和token通常用于对用户进行身份验证和授权。

鉴权(Authentication)

        鉴权是确认用户的身份是否合法的过程。这通常包括验证用户提供的凭据(例如用户名和密码)以确定其是否具有访问权限。鉴权可以通过各种方式实现,包括基本身份验证、OAuth、OpenID Connect等。

        在Web应用程序中,经常会使用用户名和密码进行鉴权。一旦用户提供了正确的凭据,系统就会允许其访问相应的资源或执行特定的操作。

Token

        在Web开发中,token通常指的是JSON Web Token(JWT),它是一种安全地在客户端和服务器之间传递信息的方式。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这些部分经过Base64编码后拼接在一起,并用于在请求中携带用户的身份和权限信息。

          当用户提供有效的凭据进行鉴权后,服务器可能会生成一个token并返回给客户端。客户端在随后的请求中将携带该token,服务器则会验证token,并根据其中的信息决定是否允许用户执行所请求的操作。

        JWT能够包含各种有关用户的信息,比如用户ID、角色、权限等。这样一来,服务器在接收到token后可以根据其中的信息进行鉴权和授权,无需重复查询数据库或其他存储介质。

        在Node.js中,使用jsonwebtoken库能够方便地生成和验证JWT token,使得鉴权和授权变得更加灵活和安全。

生成token

// 引入
const express = require("express")
const jwt = require('jsonwebtoken')
const { expressjwt } = require('express-jwt')
// console.log(expressjwt);

// 创建实例
const app = express()

// 中间件
app.use(express.json()) //解析
// 生成token的配置项
const config = {
    jwtSecretKey: 'hgf',//秘钥
    expiresIn: '5m',//有效期,分钟
}
// 加载jwt文件
app.use(
    expressjwt({
        secret: config.jwtSecretKey,
        algorithms: ['HS256'] // 免检接口添加在这里
    }).unless({
        path: [
            '/users/checkLogin'
        ]
    })
)


// const user = {
//     acount: 'admin',
//     password: '666'
// }
// 生成token的方法,jwt.sign(参数一,参数二,参数三)
// 参数一 前端传过来的用户名,密码,其他数据
// 参数二 后端定义的token'密钥
// 参数三 token有效期 
// const tokenStr = jwt.sign(user, config.jwtSecretKey, {
//     expiresIn: config.expiresIn
// })

// // tokenStr 生成的token通过verify方法解析出来的数据有用户传过来的数据,生效时间和失效时间
// console.log(tokenStr);
// console.log(jwt.verify(tokenStr, config.jwtSecretKey));
app.post('/users/checkLogin', (req, res) => {
    console.log(req.body);
    // 拿到用户传过来的用户名和密码
    const account = req.body.account
    const password = req.body.password
    const user = {
        account: account,
        password: ''
    }
    // 根据传过来的用户名和密码结合过期时间生成token
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
        expiresIn: config.expiresIn
    })
    // 把生成好的token返回前段
    // console.log('bearer' + tokenStr);
    if (account === "小貂蝉" && password === '999') {
        res.send({
            code: 0,
            msg: '登录成功',
            data: {
                account: account,
                token: 'Bearer ' + tokenStr
            }
        })
    } else {
        res.send({
            code: 1,
            msg: '登录失败'
        })
    }
})

// 登录时调用后端接口,传入用户名和密码,接口会返回一个token,token包含有效期和用户的信息
// 如果在请求时一定要携带登录时拿到的 token并传给后端,此时后端会判断token是否过期,
// 如果 token过期了直接抛错,提示前端用户token过期,请重新登录
app.get('/users/list', (req, res) => {
    // res.send("调用成功")
    res.send(`调用成功 id为:${req.query.id}`)
})


app.listen(3000, () => {
    console.log("我启动了");
})


// 以为http时状态的的协议,所以用户端在发送请求的时候无法让后端知晓是谁发的,这个无法满足实际项目的需求,且目前主流的做法就是使用token来保存状态,(用户是否已登录的状态)
// token: 是后端根据用户传入的用户名和密码,加上密钥生成的随机字符串,该字符串可以使用密钥被解密出来
// token通常是有有效期的,一般为30分钟-2小时,但是具体的还是要根据产品的设计和用户的需要来确定
// 在nodejs+express后端项目中,通常使用jwt.sign(jsonwebtoken)来生成token随即字符串和token的有效期expiresIn,使用express-jwt来解析使用生成的token,实现登录健全的功能,使用unless来添加减免接口(不需要鉴权的接口)

验证 Token:

// 客户端发送来的 Token
const clientToken = '...'; // 这里填入实际的客户端传来的 Token
 
// 验证
jwt.verify(clientToken, secretKey, (err, decoded) => {
  if (err) {
    console.error('Token 验证失败:', err.message);
  } else {
    console.log('Token 验证成功,解码信息:', decoded);
  }
});

        总之,鉴权在Node.js中的作用是确保系统只向合法用户开放,并且根据用户的身份和权限限制其访问和操作。这有助于维护系统的安全性、防止数据泄露,并确保用户行为得到适当的追踪和监管。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值