使用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”,否则会报错
在这里插入图片描述
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文件中的,如下:
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值