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);

猜你喜欢

转载自blog.csdn.net/weixin_45389051/article/details/113743168