首页 > 解决方案 > 我想在令牌过期时处理错误

问题描述

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

我现在的目标是在令牌过期时得到一个错误,以便像这样 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);
        }
      }
    );

标签: javascriptnode.jsreactjsreact-nativejwt

解决方案


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

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

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/(最后自定义回调部分)


推荐阅读