我想在令牌过期时处理错误

Posted

技术标签:

【中文标题】我想在令牌过期时处理错误【英文标题】:I would like to handle error when the token has expired 【发布时间】:2021-07-29 02:55:59 【问题描述】:

我想在 accesstoken 过期时使用条件语句来获取 refreshtoken。但是当我运行我的代码并使 accesstoken 过期时,我不知道在哪里处理错误。

我现在的目标是在令牌过期时获取错误,以便将错误字符串写入控制台,如下所示 if(error)console.log("error")。

那么我该如何修复代码呢?

这是 index.js 中的代码检查 jwt 令牌是否有效。

(index.js)

    const JWTConfig = 
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: "jwt-secret-key",
    ;

    const JWTVerify = async (jwtPayload, done) => 
      try 
        const user = await User.findOne( where:  snsId: jwtPayload.id  );
        if (user) 
          done(null, user);
          return;
        
        done(null, false,  reason: "올바르지 않은 인증정보 입니다." );
       catch (error) 
        console.error(error);
        done(error);
      
    ;

    kakao();

    module.exports = () => 
      passport.use("jwt", new JWTStrategy(JWTConfig, JWTVerify));
    ;

(auth.js)

    router.post(
      "/me",
      // auth,
      passport.authenticate("jwt",  session: false ),
      async (req, res, next) => 
        try 
        console.log("?????")
          res.status(201).json(fullUserWithoutPassword);
         catch (error) 
          console.error(error);
          next(error);
        
      
    );

【问题讨论】:

如果您的try, catch 中的用户不存在且为假,您想返回错误,对吗? 【参考方案1】:

passport.authenticate('jwt') 中间件显然不会在令牌过期时出错。

您仍然可以通过传递 passport.authenticate() 自定义回调并检查其 info 参数来查明令牌过期情况 - 在这种情况下,该参数将具有 "TokenExpiredError"name 属性。

app.get('/login', function(req, res, next) 
  passport.authenticate('jwt', function(error, payload, info) 
    if(error) 
      return next(error);
    
    
    console.log(info.name)   // output: "TokenExpiredError"

    res.status(201).json(//..);
  )(req, res, next);
);

在此处查看有关自定义回调模式的更多信息:

http://www.passportjs.org/docs/authenticate/(自定义回调部分在最后)

【讨论】:

但是,即使令牌没有过期,信息也会继续运行。

以上是关于我想在令牌过期时处理错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito:处理令牌过期时间

最终确定令牌过期时未命中 http 拦截器

Vue + Axios 处理来自服务器的所有请求错误

获取新的访问令牌以处理过期的访问令牌时,grant_type 参数无效或参数丢失

当我发送超过过期日期的令牌时,为啥会收到 401 错误?

处理 laravel 中的 jwt 身份验证错误