《基于 Koa 的登录页面实战:token秘钥》

139 阅读3分钟

《基于 Koa 的登录页面实战:token秘钥》

在验证过程中,如果不加密,那么其他人就可以获取到登录人的信息,包括密码,这是十分不严谨的,也是不安全的,更是对客户的不负责,加密的方法有很多种,今天我要提到的是jsonwebtoken(通常简称为 jwt)库来生成一个 JSON Web Token(JWT)

在 Node.js 项目中使用 jsonwebtoken 库,是需要下载安装的。

您可以通过以下命令使用包管理工具 npm 来进行安装:

npm install jsonwebtoken

或者如果您使用的是 yarn :

yarn add jsonwebtoken

安装完成后,就可以在项目中通过 require 来引入和使用它了

那我们来引用使用它吧

const jwt = require("jsonwebtoken");

function sign(option) {
  return jwt.sign(option, "999", {
    expiresIn: 86400,
  }); //加盐
}

option就是要加密的对象,option 通常可以是以下几种数据类型(键值对,通常包含了用户信息):对象,字符串(文本信息),或者数字(通常会将数字包装在对象中以提供更多上下文信息)。

第二个就是秘钥,这个是一个字符串,在使用中通常是一个非常复杂和保密性的,保障JWT的安全性。

第三个参数就是过期时间。

当 JWT 令牌过期后,通常有以下几种处理方式:

  1. 要求用户重新登录或进行身份验证:这是最常见的做法。用户需要再次提供登录凭据,服务器重新为其生成新的有效的 JWT 令牌。

  2. 提供刷新令牌机制:除了常规的访问令牌(JWT),还可以同时生成一个刷新令牌。当访问令牌过期时,使用刷新令牌向服务器请求获取新的访问令牌,而无需用户重新输入登录凭据。但要注意对刷新令牌也要进行有效管理,例如设置合理的过期时间和使用次数限制等。

  3. 拒绝访问相关操作:如果令牌过期,服务器直接拒绝用户的请求,并返回相应的错误提示,告知用户需要重新登录或获取新的有效令牌。

例如,在一个 Web 应用中,如果用户在操作过程中 JWT 令牌过期,服务器在接收到带有过期令牌的请求时,会返回一个 401 未授权的状态码,前端应用接收到这个状态码后,可以引导用户重新登录。

既然发给了用户token,那用户向后端服务器请求数据的时候也需要验证,后端需要解密然后再对比


function verify() {
  return async (ctx, next) => {
    jwttoken = ctx.req.headers.authorization;

    try {
      if (jwttoken) {
        const decoded = jwt.verify(jwttoken, "999");
        if (decoded.id) {
          ctx.userId = decoded.id; // 记录 userId 到 ctx 上,方便后面的 controller 或者 service 直接使用
          ctx.nickname = decoded.nickname;
          // 合法
          await next();
        }
      }
    } catch (e) {
      ctx.body = {
        code: "808",
        msg: "请提供token",
      };
      return;
    }
  };
}

ctx.req.headers.authorization 字段的值通常是用于携带身份验证信息。

function verify 用于解密token,需要对应的秘钥,我之前设置的是999,这个太简单了,建议用字母数字混合的复杂的,解密后就可以获取其中蕴含的信息。

  • if (decoded.id):如果解析后的结果中包含 id ,则将 id 和 nickname 记录到 ctx 对象上,然后执行下一个中间件(通过 await next(); )。

  • 如果在验证 token 的过程中出现错误(通过 try/catch 捕获),会向客户端返回一个包含错误码和错误消息的响应。