我需要帮助来验证jwt是否有效,或者创建一个新的jwt,并且如果发送的令牌不正确,则在nestjs中间件中返回错误

时间:2019-03-27 14:12:57

标签: jwt nestjs

我已经实现了jwt,它可以正常工作,但是当创建一个中间件来验证令牌是否仍处于活动状态并且有效时,如果令牌已过期,则必须创建一个新的jwt,以防无法创建一个新的,返回一条带有消息的404错误,到目前为止,我只能获得令牌并对其进行解码,我需要能够对其进行验证并返回错误响应或让它继续。

这是我的中间件代码:

import { JwtService } from '@nestjs/jwt';
import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class JwtMiddleware implements NestMiddleware {
    valid = null;
    decode = null;
    cleanToken = null;

    constructor(private readonly jwtServ: JwtService) {}

    use(req: Request, res: Response, next: Function) {
        const token = req.headers['authorization'];
        try {
            this.cleanToken = token.replace('Bearer','').trim();
            this.decode = this.jwtServ.decode(this.cleanToken);            
        } catch (error) {
            // console.log(error);
        }

        try {
            this.valid = this.jwtServ.verify(this.cleanToken);
        } catch (error) {
            console.log(error.name);
            console.log(error.message);
            console.log(error.expiredAt);
        }

        next();
    }
}

到目前为止,我只能在控制台中打印验证jwt的错误,但这不是正确的方法,除了无法向客户返回有效答案

控制台打印:

  • TokenExpiredError
  • jwt已过期
  • 2019-03-27T00:18:56.000Z

我搜索了jwt文档,以了解如何验证令牌并找到它: https://github.com/auth0/node-jsonwebtoken

// verify a token symmetric
jwt.verify(token, 'shhhhh', function(err, decoded) {
  console.log(decoded.foo) // bar
});

但是在nestjs中,它不是那样工作的。无法像这样实现“函数(错误,已解码)”功能,因此它标记了我错误,因此我不得不将其放入trycatch

我也尝试过:

this.jwtServ.verify(token,(err, decoded) => {
        if (err) {
            return res.status(401).json({
                ok: false,
                message: 'Invalid Token',
                errors: err
            });
        }

        req.user = decoded.user;

        next();
    });

他在nestjs文档中说:

默认情况下,Nest中间件等于表示中间件。这是从官方快递文档中复制的大量中间件功能的列表

https://docs.nestjs.com/middleware

我已经尝试过了,但是不起作用

return res.status(401).json({
                ok: false,
                message: 'Invalid Token',
                errors: err
            });

欢迎任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

尝试这个..使用'jsonwebtoken'包

import * as jwt from 'jsonwebtoken';
jwt.verify(token, 'shhhhh', function(err, decoded){
 console.log(decoded.foo) // bar
});