继上次写了如何优雅的处理异常,这篇讲一下如何实现JWT(json web token)认证方式;JWT是一种开放标准(RFC7519),具体的这里就不重复介绍了,能够去查看一些说明文档,这里就简单介绍一下egg里面的应用。javascript
推荐阅读: 阮一峰的JWT介绍入门html
咱们首先介绍如何本身实现中间件来完成JWT鉴权java
const jsonwebtoken = require('jsonwebtoken');
module.exports = options => {
return async(ctx, next) => {
const { authorization = '' } = ctx.request.header;
const token = authorization.replace('Bearer ', '');
try {
const user = jsonwebtoken.verify(token, 'secret');
ctx.state.user = user;
} catch (err) {
ctx.throw(401, err.message);
}
await next();
}
}
复制代码
// router.js
'use strict';
/** * @param {Egg.Application} app - egg application */
module.exports = app => {
const auth = app.middleware.customAuth();
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/login', controller.home.login);
router.get('/testlogin', auth, controller.home.needLogin);
};
复制代码
// controller/home.js
'use strict';
const jsonwebtoken = require('jsonwebtoken');
const Controller = require('egg').Controller;
class HomeController extends Controller {
// login接口用于签名,正常状况这里校验用户名密码,这里demo直接调用sign方法签名,设置过时时间为1天
async login() {
const { ctx } = this;
const secret = 'secert';
const token = jsonwebtoken.sign({ key: 'value' }, secret, { expiresIn: '1d' });
ctx.body = { token };
}
// 测试鉴权
async needLogin() {
const { ctx } = this;
ctx.body = '这是验证过的接口返回的数据';
}
}
module.exports = HomeController;
复制代码
在测试以前,咱们须要在config.default.js文件中加入下面的代码,暂时关闭csrf插件(Cross-site request forgery这是一种防止跨站请求伪造安全机制,egg中默认开启,具体细节能够去官网查看)web
config.security = {
enable: false,
},
复制代码
postman调用登陆接口json
postman调用须要鉴权的接口 这里使用了postman自带的jwt鉴权方式,同实token从全局变量中获取 安全
使用现成的koa-jwt来实现鉴权,上一篇已经说了如何引用koa中间件,这里咱们如今middleware下面建立auth.js文件bash
module.exports = require('koa-jwt');
复制代码
修改router.js中的中间件引用app
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const auth = app.middleware.auth({ secret: 'secret' });
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/login', controller.home.login);
router.get('/testlogin', auth, controller.home.needLogin);
};
复制代码
以后进行测试,依然能够获得与上述本身编写一样的效果;这里的koa-jwt就是简化了咱们的代码,实现了与本身实现的中间件verify相同的功能koa