前言
登录校验是我们在项目中经常要做的事情,在一些页面必须要登录以后才可以访问,前端的登录校验在你登录之后把登录信息保存在localStorage中,在登录时拿出来进行校验,但是这样非常的容易被破解。但是我们可以使用jwt鉴权,在你完成登录操作后,后端根据登录信息使用jwt生成出一个加密的Token返回给前端,前端每次访问需要权限的页面需要把Token返回给后端进行解密后,校验解密后的登录信息是否有效,有效再给予通行。
jwt是什么?
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 头部通常包含令牌的类型(如“JWT”)和使用的加密算法。载荷包含有关声明的信息,例如用户身份、权限、过期时间等。签名是使用头部中指定的算法对头部和载荷进行计算得到的,用于验证令牌的完整性和真实性,防止被篡改。
实际上jwt生成的Token就跟下面一样。
后端
后端我用的包管理工具是npm,访问npm官网,搜索jsonwebtoken,可以看到下面这个包。
在后端下载它:
$ npm install jsonwebtoken
当然我们下载了也需要引入:
const jwt = require('jsonwebtoken');
生成Token
jwt上有一个sign方法用来生成Token令牌。
- option是你想加密的json对象。
- Key是你自己的私钥,使你加密的私钥更加的难以破解。
- 如果同步则不需要回调函数,我们使用同步的方法。
为了方便使用,我们可以先自己封装一下它,然后再调用:
function sign(option) {
return jwt.sign(option, 'xiaobei', {
// 私钥
expiresIn: 86400, // 令牌有效时间,以秒为单位
});
}
// 登录信息
const user = {
username: 'xiaobei',
password: '123456',
nickname: '小北',
};
const token = sign(user); // 调用封装函数
console.log(token);
生成出来的Token就跟上面展示的差不多,然后就可以加在响应体里面返回给前端。
校验Token
前端该怎样把Token传到后端呢?只需要axios请求拦截,在请求头中加入Token即可,后端从中获取进行校验。jwt上拥有解密方法。
- token就是sign生成的加密令牌。
- Key是你自己的私钥,使你加密的私钥更加的难以破解。
- 我们使用同步的方法不需要回调。
const token = sign(user);
const decoded = jwt.verify(token, 'xiaobei');
console.log(decoded);
解密出来结果如下:
总结
在服务器端,使用 JWT 库,根据用户信息(如用户 ID、角色、密码等)生成 Token 令牌。将生成的 Token 作为响应的一部分发送给客户端,通常可以放在 HTTP 响应的头部(如 Authorization 头部)。客户端(如浏览器、移动应用)接收到 Token 后,可以将其存储在本地存储(LocalStorage)、会话存储(SessionStorage)中。访问需要权限的页面时再给到服务器端进行校验,实现jwt鉴权。