返回

JWT 在 Vue.js + Koa.js 项目中的用法

前端

前言

随着前后端分离架构的兴起,越来越多的项目开始使用 JSON Web Token (JWT) 来进行用户认证和授权。JWT 是一种轻量级的安全令牌,可以用来在不同系统之间传递信息,在本文中,我们将介绍如何在 Vue.js 前端和 Koa.js 后端之间使用 JWT 来实现用户认证和授权。

JWT 简介

JWT 是一个开放标准,定义了一种紧凑和自包含的方式,用于在各方之间安全地传输信息。JWT 由三部分组成:头部、载荷和签名。

  • 头部:包含令牌的元数据,例如令牌的类型和签名算法。
  • 载荷:包含要传输的信息,例如用户 ID、用户名和角色。
  • 签名:使用头部和载荷计算的签名,用于验证令牌的完整性和真实性。

在 Vue.js + Koa.js 项目中使用 JWT

1. 安装依赖

首先,我们需要在项目中安装必要的依赖。对于 Vue.js 前端,我们需要安装 vue-jwt-decode 包,该包可以帮助我们解码 JWT 令牌。对于 Koa.js 后端,我们需要安装 jwt-simple 包,该包可以帮助我们生成和验证 JWT 令牌。

// Vue.js 前端
npm install vue-jwt-decode

// Koa.js 后端
npm install jwt-simple

2. 配置 Koa.js 后端

在 Koa.js 后端,我们需要配置 JWT 认证和授权中间件。

// 引入必要的包
const jwt = require('jwt-simple');
const secret = 'your-secret-key'; // 替换为您的密钥

// 配置 JWT 认证中间件
app.use(async (ctx, next) => {
  const token = ctx.headers['authorization'];
  if (token) {
    try {
      const decoded = jwt.decode(token, secret);
      ctx.state.user = decoded;
    } catch (err) {
      ctx.status = 401;
      ctx.body = {
        message: 'Invalid token'
      };
      return;
    }
  }
  await next();
});

// 配置 JWT 授权中间件
app.use(async (ctx, next) => {
  const requiredRole = ctx.state.route.meta.role;
  if (requiredRole && !ctx.state.user.roles.includes(requiredRole)) {
    ctx.status = 403;
    ctx.body = {
      message: 'Forbidden'
    };
    return;
  }
  await next();
});

3. 配置 Vue.js 前端

在 Vue.js 前端,我们需要配置 Vuex 存储来存储 JWT 令牌。

// 引入必要的包
import Vue from 'vue'
import Vuex from 'vuex'
import jwtDecode from 'vue-jwt-decode'

// 创建 Vuex 存储
const store = new Vuex.Store({
  state: {
    token: null
  },
  mutations: {
    setToken(state, token) {
      state.token = token
    }
  }
})

// 创建一个 Vuex 插件来解码 JWT 令牌
const jwtPlugin = {
  install(Vue) {
    Vue.prototype.$jwtDecode = jwtDecode
  }
}

// 安装 Vuex 存储和 Vuex 插件
Vue.use(Vuex)
Vue.use(jwtPlugin)

4. 使用 JWT 进行认证和授权

4.1 用户登录

当用户登录时,我们可以使用 Koa.js 后端生成一个 JWT 令牌,并将该令牌返回给前端。

// Koa.js 后端
app.post('/login', async (ctx) => {
  const { username, password } = ctx.request.body;
  const user = await User.findOne({ username, password });
  if (user) {
    const token = jwt.encode({ id: user._id, username: user.username, roles: user.roles }, secret);
    ctx.body = {
      token
    };
  } else {
    ctx.status = 401;
    ctx.body = {
      message: 'Invalid username or password'
    };
  }
});

4.2 用户注销

当用户注销时,我们可以简单地将 Vuex 存储中的 JWT 令牌设置为 null。

// Vue.js 前端
store.commit('setToken', null)

4.3 获取用户资料

当我们需要获取用户资料时,我们可以使用 Vue.js 前端中的 JWT 令牌来请求 Koa.js 后端。

// Vue.js 前端
async fetchUserProfile() {
  const token = store.state.token;
  const response = await fetch('/api/profile', {
    headers: {
      Authorization: `Bearer ${token}`
    }
  });
  const data = await response.json();
  return data;
}

4.4 检查用户权限

当我们需要检查用户权限时,我们可以使用 Vue.js 前端中的 JWT 令牌来请求 Koa.js 后端。

// Vue.js 前端
async checkUserPermission(permission) {
  const token = store.state.token;
  const response = await fetch('/api/check-permission', {
    headers: {
      Authorization: `Bearer ${token}`
    },
    body: JSON.stringify({ permission })
  });
  const data = await response.json();
  return data;
}

总结

在本文中,我们介绍了如何在 Vue.js + Koa.js 项目中使用 JWT 进行用户认证和授权。JWT 是一种轻量级的安全令牌,可以用来在不同系统之间传递信息,在本文中,我们将介绍如何在 Vue.js 前端和 Koa.js 后端之间使用 JWT 来实现用户认证和授权。