利用jwt鉴权(Token) 进行登录校验

196 阅读3分钟

前言

登录校验是我们在项目中经常要做的事情,在一些页面必须要登录以后才可以访问,前端的登录校验在你登录之后把登录信息保存在localStorage中,在登录时拿出来进行校验,但是这样非常的容易被破解。但是我们可以使用jwt鉴权,在你完成登录操作后,后端根据登录信息使用jwt生成出一个加密的Token返回给前端,前端每次访问需要权限的页面需要把Token返回给后端进行解密后,校验解密后的登录信息是否有效,有效再给予通行。

jwt是什么?

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。

JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 头部通常包含令牌的类型(如“JWT”)和使用的加密算法。载荷包含有关声明的信息,例如用户身份、权限、过期时间等。签名是使用头部中指定的算法对头部和载荷进行计算得到的,用于验证令牌的完整性和真实性,防止被篡改。

实际上jwt生成的Token就跟下面一样。

image.png

后端

后端我用的包管理工具是npm,访问npm官网,搜索jsonwebtoken,可以看到下面这个包。

image.png

在后端下载它:

$ npm install jsonwebtoken

当然我们下载了也需要引入:

const jwt = require('jsonwebtoken');

生成Token

jwt上有一个sign方法用来生成Token令牌。

image.png

  • 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就跟上面展示的差不多,然后就可以加在响应体里面返回给前端。

image.png

校验Token

前端该怎样把Token传到后端呢?只需要axios请求拦截,在请求头中加入Token即可,后端从中获取进行校验。jwt上拥有解密方法。

image.png

  • token就是sign生成的加密令牌。
  • Key是你自己的私钥,使你加密的私钥更加的难以破解。
  • 我们使用同步的方法不需要回调。
const token = sign(user);

const decoded = jwt.verify(token, 'xiaobei');

console.log(decoded);

解密出来结果如下:

image.png

总结

在服务器端,使用 JWT 库,根据用户信息(如用户 ID、角色、密码等)生成 Token 令牌。将生成的 Token 作为响应的一部分发送给客户端,通常可以放在 HTTP 响应的头部(如 Authorization 头部)。客户端(如浏览器、移动应用)接收到 Token 后,可以将其存储在本地存储(LocalStorage)、会话存储(SessionStorage)中。访问需要权限的页面时再给到服务器端进行校验,实现jwt鉴权。