您的位置:

egg-jwt介绍

一、什么是egg-jwt

egg-jwt是阿里Egg.js团队为了方便使用JSON Web Token(JWT)而推出的插件。它是基于egg-passport,egg-jwt实现了更为方便的JWT验证和生成功能。JWT是一种用于身份验证的标准数据传输格式,它主要用于跨域认证。JWT由三部分组成:头部、负载和签名。

二、egg-jwt使用场景

JWT的简便性和通用性使得它成为许多Web应用程序的安全解决方案。使用JWT的统一标识符,在Web应用程序和API中,可以更容易地跨域传输令牌。

在使用egg.js时,经常需要利用JWT对身份验证进行支持。egg-jwt提供了方便的中间件,可以更轻松地进行jwt验证和生成,使开发更简单,可以更快地构建应用程序。

三、egg-jwt的安装和使用方法

1、安装

使用npm安装egg-jwt模块:

npm install egg-jwt

2、配置

在你的应用程序中的config.default.js或config/config.${environ}.js文件中增加以下配置。

exports.jwt = {
  secret: '123456', // your jwt secret
  enable: true, // enable middleware for egg, default is true
  match: '/jwt', // optional
  exclude: ['/jwt/login'], // optional
};

其中,secret是你的秘钥,该秘钥用于生成JWT,建议使用随机生成的密码。

同时,你可以通过配置项enable来指定JWT中间件的开启与否,match配置项用于指定中间件需要进行验证的路由,exclude字段则用来排除某些不需要验证的路由。

3、使用

我们可以在Controller中使用egg-jwt提供的方法进行jwt的签发和验证。

编写一个登录接口,签发用户的jwt:

const Controller = require('egg').Controller;
const jwt = require('jsonwebtoken');

class UserController extends Controller {
  async login() {
    const { ctx } = this;
    const user = {
      username: ctx.request.body.username,
      password: ctx.request.body.password,
    };
    const userInfo = await ctx.service.user.login(user);
    if (!userInfo) {
      ctx.body = {
        success: false,
        message: 'Authentication failed!',
      };
      ctx.status = 401;
    } else {
      const token = jwt.sign(userInfo, this.config.jwt.secret);
      ctx.body = {
        success: true,
        message: 'Authentication successful!',
        token,
      };
      ctx.status = 200;
    }
  }
}

编写一个需要验证用户身份的数据接口:

const Controller = require('egg').Controller;

class UserController extends Controller {
  async getUserInfo() {
    const { ctx } = this;
    const user = ctx.user;
    const userInfo = await ctx.service.user.getUserInfo(user);
    ctx.body = {
      success: true,
      message: 'Get user info successful!',
      data: {
        username: userInfo.username,
        email: userInfo.email,
      }
    };
    ctx.status = 200;
  }
}

4、JWT中间件使用方法

egg-jwt提供了Jwt中间件,我们可以轻松地访问的请求进行Jwt身份验证,请求中包含无效的Token,将返回401 Unauthorized响应。

特别注意:要在路由中使用jwt中间件,必须将JWT的验证路由放在所有需要验证的路由的前面。

在我们的应用程序中添加jwt中间件

exports.middleware = [ 'jwt' ];

有时候,我们需要针对不同的路由使用不同的Jwt配置,eggs-jwt提供了中间件的options设置项,可以覆盖默认的jwt插件配置项。

exports.middleware = [
  'jwt',
];

exports.jwt = {
  secret: '123456',
  expiresIn: '1h',
  match(ctx) {
    const url = ctx.request.url;
    if (url.startsWith('/api')) {
      return true;
    }
    return false;
  },
};

上面的配置中,通过options方式让JWT中间件在API请求中工作,并设置了JWT有效期为1小时。

四、egg-jwt插件的优缺点

优点:

1、egg-jwt方便开发者进行JWT的生成和校验工作。

2、插件提供了很方便的中间件支持,开发者可以轻松地在应用程序中使用JWT进行身份验证。

3、简化了开发人员对JWT管理的复杂性。

缺点:

1、对于刚开始使用Egg.js的开发者,需要一些时间来学习如何正确地使用该插件。

2、如果不小心曝露出你的JWT秘钥,那么你的应用程序就会存在被攻击的风险。开发者需要妥善保管秘钥,防止泄露。

五、总结

本文为大家介绍了egg-jwt的基本概念和使用方法,以及它在Egg.js中的优缺点。我们希望本文可以帮助您快速了解并使用egg-jwt,提高您的开发效率和开发质量。