koa实现jwt登陆返回token,公钥私钥进行验证

为了安全起见,设置token的时候我们都会用自己的私钥,然后别人调用验证的时候用公钥

那第一步肯定是先获取我们的公钥和私钥了

MAC和Windows不一样,我这里只说mac怎么获取…

创建一个文件夹,然后cd到这个文件夹里面

在这里插入图片描述
完成这几个命令即可

那第二步肯定是登陆时候返回token了

先安装我们的jwt插件

cnpm I jsonwebtoken --save

我把私钥弄成了一个环境变量

const PRIVATE_KEY = fs.readFileSync(path.resolve(__dirname,'./keys/private.key'));

然后开始设置token了

class AuthController {
  async login(ctx, next) {
    const { id, name } = ctx.user;
    const token = jwt.sign({ id, name }, PRIVATE_KEY, {
      expiresIn: 60 * 60, //过期时间
      algorithm: 'RS256'
    });
    ctx.body = {
      id,
      name,
      token
    };
  }
  async success(ctx,next) {
    ctx.body = '授权成功'
  }
}

这样我们的token就可以返回了

那第三步肯定是验证了,比如我们调用一些接口,需要验证token才行

我把公钥也弄成了一个环境变量

const PUBLIC_KEY = fs.readFileSync(path.resolve(__dirname,'./keys/public.key'));

然后开始验证token

const verifyAuth = async (ctx,next) =>{
  console.log('验证授权的middleware')
  // 1.获取我们的token
  const authorization = ctx.headers.authorization;
  if(!authorization){
    const error = new Error(errorTypes.UNAUTHORIZATION);
    return ctx.app.emit('error',error,ctx);
  }
  const token = authorization.replace('Bearer ','');

  // 2.验证token
  try {
   const res = jwt.verify(token,PUBLIC_KEY,{
     algorithms:['RS256']
   });
   ctx.user = res;
   await next();
  } catch (err) {
    const error = new Error(errorTypes.UNAUTHORIZATION);
    ctx.app.emit('error',error,ctx);
  }
}

设置错误代码,这两行是为了当没有token或者token过期时候给客户端返回的结果,你们可以先删掉

    const error = new Error(errorTypes.UNAUTHORIZATION);
    return ctx.app.emit('error',error,ctx);

OK,方法都封装好了,使用应该都会吧,把它当成中间件啊,类似这样

authRouter.get('/test',verifyAuth);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值