jwt - 在Vue.js中存储令牌的位置?

12 浏览
0 Comments

jwt - 在Vue.js中存储令牌的位置?

我在某个安全博客上读到,将令牌存储在本地存储中是不安全的,所以我想要将令牌存储在vuex存储中,并且在所有后续请求中都包含该令牌。但是我无法在成功登录时访问令牌,我想要做的是将令牌首次存储在vuex存储中,我考虑将令牌发送到响应体中,但这将是一种容易受攻击的方法,所以我将其发送到header["authorization"]中。下面分别是我的user.js和login.vue文件。

router.post('/login', function (req, res, next) {
    const { UserName, Password } = req.body;
    if (UserName.length == 0 || Password.length == 0) {
        res.status(400).json({ message: '电子邮件或密码为空' });
    } else {
        login_pool.query(
            'SELECT * FROM authentication WHERE user_name = ($1) and password = crypt(($2), password)',
            [UserName, Password],
            (err, results) => {
                if (err) {
                    throw err;
                } else if (results.rows.length == 1) {
                    // 登录成功
                    const token = jwt.sign(
                        {
                            user_name: results.rows[0].user_name,
                            full_name: results.rows[0].full_name,
                            phone_number: results.rows[0].phone_number,
                        },
                        btoa(process.env.TOKEN_SECRET), // 将token_secret转换为base 64
                        { expiresIn: '1800s' },
                        { algorithm: 'HS256' },
                        (err) => {
                            if (err) {
                                res.status(400).json({ message: '无法创建令牌' });
                                console.log(err);
                            }
                        }
                    );
                    res.header('Authorization', `Bearer ${token}`);
                    res.status(201).json({ message: results.rows[0].full_name + '已登录' });
                    console.log(results.rows[0].full_name + '刚刚登录');
                } else {
                    login_pool.query(
                        'SELECT * FROM authentication WHERE user_name = ($1)',
                        [UserName],
                        (errUser, resultUser) => {
                            if (resultUser.rows.length != 1) {
                                res.status(400).json({ message: '不存在此电子邮件的用户' });
                            } else {
                                res.status(400).json({ message: '密码不正确' });
                            }
                        }
                    );
                }
            }
        );
    }
});

LoginSubmit() {
    this.axios
        .post(
            "http://127.0.0.1:3000/users/login",
            {
                UserName: this.UserName,
                Password: this.Password,
            },
            {
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    "Access-Control-Allow-Origin": "*",
                    Accept: "application/vnd.api+json",
                },
            }
        )
        .then(
            (res) => {
                // 登录成功
                console.log(res.headers); // 这里没有认证头
                this.Error = "";
                console.log(this.axios.defaults.headers.common); // 这里没有认证头
            },
            (err) => {
                console.log(err.response.data.message);
                this.Error = err.response.data.message.replace(/"/g, "");
            }
        );
},

0
0 Comments

在Vue.js中存储令牌的问题通常是指如何将令牌存储在前端以供后续使用。这个问题可能出现的原因是开发者想要在前端访问后端返回的Authorization Header,但是并没有直接的方法来获取该头部信息。

解决这个问题的方法是使用Access-Control-Expose-Headers头部来暴露Authorization头部,使其可以在前端访问到。具体的解决方法是在后端响应中添加如下代码:

res.header({
   Authorization: "Bearer" + token,
   "Access-Control-Expose-Headers": "Authorization",
});

这样一来,前端就可以通过`res.headers["authorization"]`来获取Authorization头部的值了。

需要注意的是,Authorization头部本身是一个请求头部,不应该被用于存储令牌信息。如果想要以头部的形式返回令牌,可以使用自定义的头部(需要将其暴露出来)。

另外,根据具体情况,也可以考虑使用会话与cookie来存储令牌信息。

0
0 Comments

在Vue.js中存储JWT令牌的位置 - 问题的出现和解决方法

在Vue.js中使用JWT进行身份验证时,我们需要确定在哪里存储令牌以便在后续的API请求中使用。 有两种主要的存储方式:localStorage和cookie。localStorage是浏览器提供的一种用于在本地存储数据的机制,而cookie是一种通过HTTP响应头设置并由浏览器自动处理的机制。

首先,让我们看一下问题的出现原因。在之前的实践中,人们通常会将JWT令牌存储在localStorage中,并在每个API请求中手动将令牌添加到请求头中。然而,这样做存在一些潜在的安全风险。如果您的网页中包含的任何第三方脚本被攻击者入侵,他们就能够访问localStorage中存储的令牌,从而获取用户的所有令牌。

为了解决这个问题,有人建议将JWT令牌作为一个httpOnly的cookie发送给客户端。使用httpOnly设置,可以使cookie对JavaScript不可访问,增加了令牌的安全性。客户端收到这个cookie后,将自动在后续的API请求中添加Cookie头,无需手动处理。这种方式可以减少前端JavaScript代码的复杂性,并提高安全性。

然而,使用cookie存储JWT令牌也存在一些问题。首先,您需要确保API的响应头正确设置了Set-Cookie头,以便浏览器可以保存cookie。其次,如果您的身份验证流程需要使用“Authorization: Bearer ...”头来发送令牌,那么使用cookie存储令牌可能不适用。最后,您需要确保使用https协议来发送和接收cookie,以确保数据的安全性。

解决方法是将JWT令牌作为httpOnly的cookie发送给客户端,以增加令牌的安全性。如果您的身份验证流程适用于此方式,并且您确保使用https协议进行通信,那么这种方法是可行的。但请记住,无论您选择哪种存储方式,都需要注意安全性,并确保您的应用程序的其他部分也是安全的。

参考链接:https://blog.logrocket.com/jwt-authentication-best-practices

0