jwt - 在Vue.js中存储令牌的位置?
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, ""); } ); },
在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来存储令牌信息。
在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