跳到主要内容

Egg怎么使用JWT

今天学了一下午的 Egg,那它怎么使用 JWT 做用户登录验证接口呢?

1、安装egg-jwt模块

npm install egg-jwt --save

2、在Egg应用的config/plugin.js文件中添加以下配置:

exports.jwt = {
enable: true,
package: 'egg-jwt',
};

3、在config/config.default.js文件中添加JWT的配置:

exports.jwt = {
secret: 'alisir', // 用于签署和验证JWT的秘钥
expiresIn: 60 * 60 * 24, // JWT的有效期,单位为秒
};

4、创建一个用户登录的路由

例如/api/login,在该路由下编写登录接口的逻辑:

// app/router.js
module.exports = app => {
const { router, controller } = app;

router.post('/api/login', controller.user.login);
};

// app/controller/user.js
const Controller = require('egg').Controller;

class UserController extends Controller {
async login() {
const { ctx, app } = this;
const { username, password } = ctx.request.body;

// 检查用户名和密码是否正确
const user = await ctx.service.user.checkUser(username, password);
if (!user) {
ctx.status = 401;
ctx.body = { message: '用户名或密码错误' };
return;
}

// 签发JWT令牌
const token = app.jwt.sign({ id: user.id, username: user.username });

// 将令牌返回给客户端
ctx.body = { token };
}
}

module.exports = UserController;

5、解释

在上面的示例中,app.jwt.sign()方法用于签署JWT令牌,其中传入的对象为需要保存在JWT中的信息,例如用户ID和用户名。在实际的应用中,可能需要根据您的业务逻辑进行调整。

5.1、在需要验证用户登录状态的路由中,添加JWT中间件进行验证,例如/api/alisirfile

// app/router.js
module.exports = app => {
const { router, controller } = app;

router.post('/api/login', controller.user.login);
router.get('/api/alisirfile', app.jwt, controller.user.alisirfile);
};

// app/controller/user.js
class UserController extends Controller {
async alisirfile() {
const { ctx } = this;

// 从JWT中获取用户信息
const { id, username } = ctx.state.user;

// 返回用户信息给客户端
ctx.body = { id, username };
}
}

6、总结

在上面的示例中,app.jwt中间件用于验证JWT令牌的有效性,并将解码后的JWT存储在ctx.state.user中,以便后续使用。 这样可以使用Egg编写JWT用户登录验证接口了。