当我的用户登录时,我设置了一个 HTTPonly cookie access_token。我有一个中间件 auth,它验证 cookie access_token 的值是否授权用户。 当直接从服务器端发出请求并且中间件成功检索 cookie 时,它工作得很好。
但是当我通过 Ajax 在我的应用程序(相同域和相同端口)上调用一些路由时,中间件找不到 cookie access_token(因此拒绝连接)并且在 Web 检查器上,我没有看到任何 cookie 发送请求。
Ajax 请求似乎应该发送所有副本(甚至是 HTTPonly cookie),但我不知道为什么它不适用于我的应用程序。 你知道为什么吗?
非常感谢! 路易
这可能是因为 JavaScript 代码无法访问 HTTPOnly cookie,以防止跨站点脚本 (XSS) 攻击。由于 AJAX 请求是由 JavaScript 代码发出的,因此它无法访问 HTTPOnly cookie。
这个问题的一个解决方案是将cookie设置为常规cookie(不带HTTPOnly标志)并使用一些其他措施来防止XSS攻击。但是,不推荐使用这种方法,因为它会损害应用程序的安全性。
另一种解决方案是在请求标头中包含访问令牌而不是 cookie。这样,访问令牌可以通过 JavaScript 代码访问并与 AJAX 请求一起发送。为此,您可以在用户登录时将访问令牌设置为响应中的自定义标头,然后将其包含在后续请求的标头中。
这里是如何使用 Express 在响应中设置自定义标头的示例:
res.set('Authorization', `Bearer ${accessToken}`);
这里是一个如何使用 jQuery 在 AJAX 请求中包含自定义标头的示例:
$.ajax({
url: '/api/data',
headers: {
'Authorization': `Bearer ${accessToken}`
},
success: function(data) {
// do something with the data
}
});
请注意,您仍应使用其他安全措施来防止 XSS 攻击,例如清理用户输入和使用内容安全策略 (CSP) 标头。