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