You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExpressJS中access_token过期后更新无法被isAuthenticated读取

问题:ExpressJS JWT认证中access_token过期后isAuthenticated无法读取新令牌

我在ExpressJS中使用JWT实现认证,后端通过res.cookie向前端设置令牌,用Postman测试API。每次调用API时会先执行updateAccessToken中间件,生成新的access_token和refresh_token并设置到cookie中。access_token有效期内请求一切正常,但当access_token过期后调用API,isAuthenticated中间件无法读取到access_token。

路由配置中updateAccessToken在isAuthenticated之前执行,updateAccessToken内已成功设置新的cookie,但isAuthenticated读取req.cookies时找不到access_token。Postman中请求响应后能看到新的access_token,但cookie顺序异常。此前使用Redis存储,现在改用MongoDB,期望isAuthenticated能正常读取更新后的access_token。


路由代码(Route.ts)

const BlogRoute = express.Router();

BlogRoute.route("/blog/all-blogs").get(getAllBlogPosts);

BlogRoute.route("/blog/single/:blogID")
    .get(getSingleBlogPost)
    .put(
        updateAccessToken,
        isAuthenticated,
        authorizeRoles("admin"),
        multerUploads.array("files"),
        updateBlogPost
    )

updateAccessToken中间件

export const updateAccessToken = CatchAsyncError(
    async (req: Request, res: Response, next: NextFunction) => {
        const { refresh_token } = req.cookies;
        console.log("updateAccessToken: Received cookies", req.cookies);

        if (!refresh_token) {
            return next(new ErrorHandler("Refresh token is missing", 401));
        }

        try {
            const decoded = jwt.verify(
                refresh_token,
                process.env.REFRESH_TOKEN_SECRET as string
            ) as JwtPayload;

            const user = await UserModel.findById(decoded._id);

            if (!user) {
                return next(new ErrorHandler("User not found", 404));
            }

            const newAccessToken = user.signAccessToken();
            const newRefreshToken = user.signRefreshToken();

            res.cookie("access_token", newAccessToken, accessTokenOptions);
            res.cookie("refresh_token", newRefreshToken, refreshTokenOptions);
            console.log("updateAccessToken: New tokens set");

            req.user = user;
        } catch (error) {
            return next(new ErrorHandler("Invalid refresh token", 401));
        }

        next();
    }
);

isAuthenticated中间件

export const isAuthenticated = CatchAsyncError(
    async (req: Request, res: Response, next: NextFunction) => {
        const { access_token } = req.cookies;
        console.log("isAuthenticated: Received cookies", req.cookies);

        if (!access_token) {
            return next(
                new ErrorHandler("Please login to access this resource", 400)
            );
        }

        try {
            const decoded: any = jwt.verify(
                access_token,
                process.env.ACCESS_TOKEN_SECRET as string
            );

            if (!decoded) {
                return next(new ErrorHandler("Invalid access_token", 400));
            }

            const user = await UserModel.findById(decoded._id);

            if (!user) {
                return next(new ErrorHandler("User not found", 404));
            }

            (req as any).user = user;
        } catch (error) {
            return next(
                new ErrorHandler("IsAuthenticated Error in Auth.ts", 400)
            );
        }

        next();
    }
);

内容的提问来源于stack exchange,提问作者Sayedul Karim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:32:09