首页 > 解决方案 > 使用令牌在后端和前端识别用户进行身份验证

问题描述

我想使用 Json Web Tokens 创建一个简单的 Express API。当用户尝试登录时,我执行此操作

exports.signIn = async (req, res, next) => {
    const { username, password } = req.body;

    // get user from database
    const userQueryResult = await userQueries.getUserByName([username]);

    // return if database errors occured
    if (userQueryResult.err) {
        res.status(500).json({
            message: userQueryResult.err.message
        });
    }

    const users = userQueryResult.result;
    const user = users[0];

    // no user found
    if (!user) {
        res.status(401).json({
            message: 'Auth failed'
        });
    }

    try {
        // validate the password
        const passwordMatch = bcrypt.compareSync(password, user.passwordHash);

        // wrong credentials
        if (!passwordMatch) {
            res.status(401).json({
                message: 'Auth failed'
            });
        }

        const token = jwt.sign({
            user.id
        }, tokenSecret, {
                tokenExpiration
            });

        res.status(200).json({
            message: 'Auth succeeded',
            token
        });
    } catch (err) {
        res.status(401).json({
            message: 'Auth failed'
        });
    }
};

生成一个新的令牌并发送给客户端。我是否也必须将用户对象发送给客户端?因为目前我只检查用户是否经过身份验证而不是哪个用户。

对于受保护的路由,我检查用户是否使用中间件功能进行了身份验证

module.exports = (req, res, next) => {
    try {
        const rawToken = req.headers.authorization; // bearer <token>
        const token = rawToken.split(' ')[1]; // extract the token
        req.userData = jwt.verify(token, tokenSecret); // verify this token
        next();
    } catch (error) {
        res.status(401).json({
            message: 'Auth failed'
        });
    }
}

那么您是否也会将用户 ID 发送给客户端?您是否将其与令牌一起存储到本地浏览器存储中并在删除令牌时将其删除?

也许我弄错了,但目前我只知道如何检查某人是否经过身份验证,但不知道是哪一个。客户端需要知道当前登录的是哪个用户。

标签: javascriptnode.jsexpressauthenticationjwt

解决方案


生成一个新的令牌并发送给客户端。我是否也必须将用户对象发送给客户端?因为目前我只检查用户是否经过身份验证而不是哪个用户。

从技术上讲,您还可以发送用户对象(和任何其他信息),但通常您想要发回的只是 jwt 令牌,因为它包含您在客户端需要的所有信息(有效负载)。

那么您是否也会将用户 ID 发送给客户端?

与上一个答案相同,如果您需要客户端的用户 ID,请将其包含在 jwt 有效负载中。

您是否将其与令牌一起存储到本地浏览器存储中并在删除令牌时将其删除?

如果您需要它作为永久的东西(页面重新加载)它们是的,请将 jwt 令牌或其他任何东西保存到本地存储中。

也许我弄错了,但目前我只知道如何检查某人是否经过身份验证,但不知道是哪一个。客户端需要知道当前登录的是哪个用户。

您正在寻找的是您在服务器端检查的用户授权(而不是身份验证)。


推荐阅读