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用户登录验证接口了。