在发布路线上的单个中间件功能内使用刷新令牌刷新JWT访问令牌

时间:2020-10-14 17:04:04

标签: node.js express authentication jwt middleware

我正在尝试在JWT中学习express身份验证,而我遇到的一件事是this code from Github

此人已初始化一个middleware函数,以按照以下要求进行身份验证和检查访问令牌的有效期:

app.post("/protected", auth, (req, res) => {
    return res.json({ message: "Protected content!" });
})
async function auth(req, res, next) {
    let token = req.headers["authorization"];
    token = token.split(" ")[1]; //Access token

    jwt.verify(token, "access", async (err, user) => {
        if (user) {
            req.user = user;
            next();
        } else if (err.message === "jwt expired") {
            return res.json({
                success: false,
                message: "Access token expired"
            });
        } else {
            console.log(err);
            return res
                .status(403)
                .json({ err, message: "User not authenticated" });
        }
    });
}

,以及在access token的帮助下刷新refresh token的单独途径

app.post("/refresh", (req, res, next) => {
    const refreshToken = req.body.token;
    if (!refreshToken || !refreshTokens.includes(refreshToken)) {
        return res.json({ message: "Refresh token not found, login again" });
    }

    // If the refresh token is valid, create a new accessToken and return it.
    jwt.verify(refreshToken, "refresh", (err, user) => {
        if (!err) {
            const accessToken = jwt.sign({ username: user.name }, "access", {
                expiresIn: "20s"
            });
            return res.json({ success: true, accessToken });
        } else {
            return res.json({
                success: false,
                message: "Invalid refresh token"
            });
        }
    });
});

所以,我的问题是它的安全性如何以及如何创建一个既可以进行身份​​验证又可以刷新访问令牌而又不击中app.post('/refresh')的中间件功能,因为在我看来这不会是一种平稳的体验在React的前端API管理中处理它

修改

我的中间件似乎运行良好,但是并没有识别出错误的刷新令牌,然后实际上在受保护的路由上工作了

app.post('/home', authenticateUser, (req, res) => {
    res.send('welcome');
});

async function authenticateUser(req, res, next) {
    let token = req.headers['authorization'];
    token = token.split(' ')[1];

    jwt.verify(token, JWT_AUTH_TOKEN, async (err, phone) => {
        if (phone) {
            req.phone = phone;
            next();
        } else if (err) {
            const refreshToken = req.body.refreshToken;
            if (!refreshToken || !refreshTokens.includes(refreshToken)) {
                return res.json({ message: 'Refresh token not found, login again' });
            } else {
                jwt.verify(refreshToken, JWT_REFRESH_TOKEN, (err, phone) => {
                    if (!err) {
                        const accessToken = jwt.sign({ phone }, JWT_AUTH_TOKEN, { expiresIn: '30s' });
                        return res.json({ success: true, accessToken });
                        
                    } else {
                        return res.json({
                            success: false,
                            message: 'Invalid refresh token'
                        });
                    }
                    next();
                });
            }
        } else {
            console.log(err);
            return res.status(403).json({ err, message: 'User not authenticated' });
        }
    });
}

0 个答案:

没有答案