使用koa-jwt进行身份验证——koa2

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”,否则会报错
使用koa-jwt进行身份验证——koa2_第1张图片
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有效时
使用koa-jwt进行身份验证——koa2_第2张图片
token过期时
在这里插入图片描述
补充说明,以上对token的生成和解析函数楼主单独写在一个token_verify.js文件中的,如下:
使用koa-jwt进行身份验证——koa2_第3张图片

你可能感兴趣的:(koa,服务器)