1、安装koa-jwt及jsonwebtoken
加--save后会将中间件(koa-jwt/jsonwebtoken)写入package.json中,不加的话就不会写入
npm install --save koa-jwt
npm install --save jsonwebtoken
2、用户登录时生成token
const router = require('koa-router')()
const setToken = require('../../public/javascripts/token_verify')
router.prefix('/comic_admin_users')
router.post('/login', async (ctx, next)=> {
//存入token的信息可以是用户id或者用户名,不要存入敏感信息(下面是我模拟的假数据)
var username = 'slj';
var userid = "111";
setToken.setToken(username, userid).then((data)=>{
ctx.body = {
msg:'登录成功',
token:data
}
})
await next();
})
3、测试如下
4、前端将token保存到本地,请求接口时就带上这个token
注意:jwt-koa的验证机制需要将token设置为“authorization:Bearer token”,否则会报错
5、当用户带着token来请求用户数据时,解析出token中的用户id,再进行数据库的操作,考虑到需要解析token的路由中间件很多,所以我把token的解析放到全局中间件app.js中,如下是需要添加到app.js中的代码
const koa_jwt = require('koa-jwt')
const verToken = require('./public/javascripts/token_verify')
app.use(async(ctx, next)=> {
var token = ctx.headers.authorization;
if(token == undefined){
await next();
}else{
verToken.verToken(token).then((data)=> {
//这一步是为了把解析出来的用户信息存入全局state中,这样在其他任一中间价都可以获取到state中的值
ctx.state = {
data:data
};
})
await next();
}
})
app.use(async(ctx, next)=>{
return next().catch((err) => {
if (401 == err.status) {
ctx.status = 401;
ctx.body = {
status:401,
msg:'登录过期,请重新登录'
}
} else {
throw err;
}
});
});
app.use(koa_jwt({
secret: defined.signkey
}).unless({
path: ['/comic_admin_users/login'] //除了这个地址,其他的URL都需要验证
}));
6、现在我们带着token来访问服务器, 在路由中间件中通过ctx.state.user来获取用户信息
const router = require('koa-router')()
router.prefix('/admin')
router.post('/', async(ctx, next) => {
const username = ctx.state.user.username;
const _id = ctx.state.user._id;
ctx.body = {
status:200,
userinfo:{
username:username,
id:_id
}
}
await next();
})
访问/admin接口,结果如下
token有效时
token过期时
补充说明,以上对token的生成和解析函数楼主单独写在一个token_verify.js文件中的,如下: