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

Posted

技术标签:

【中文标题】我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误【英文标题】:I need help to verify that jwt is valid or otherwise create a new one and if the token sent is not correct return an error in nestjs middleware我需要帮助来验证 jwt 是否有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误 【发布时间】:2019-08-18 03:32:54 【问题描述】:

我已经实现了 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 中它不是这样工作的。函数“function(err, decoded)”不能这样实现,所以它标记了我错误,所以我不得不把它放在一个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 中间件等同于 express 中间件。这是从官方 express 文档中复制的中间件功能列表

https://docs.nestjs.com/middleware

我已经试过了,还是不行

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

欢迎任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

请在您的代码中添加一些解释,以便其他人可以从中学习 JwtService from @nestjs/jwt 已经在下面使用jsonwebtoken

以上是关于我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误的主要内容,如果未能解决你的问题,请参考以下文章

这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?

如何延长node.js中相同jwt令牌的到期时间

Java一次替换字符串中的多个不同子字符串(或以最有效的方式)

需要一些有关 REST API 的 JWT 身份验证的信息

客户是不是应该创建自己的 JWT

Ping 或以其他方式通过 C# 中的 MAC 判断设备是不是在网络上