javascript - 来自节点获取的会话 cookie 无效?
问题描述
我现在正在编写一个 javascript 程序(用于 github 操作),但遇到了问题。我
试图登录www.overleaf.com并通过向https://www.overleaf.com/login发送 POST 请求来生成会话 cookie 后访问页面https://www.overleaf.com/project凭据和 csrf 令牌。
响应在 set-cookie 标头中包含所请求的令牌,但是,当我尝试通过 GET 访问https://www.overleaf.com/project时,我被重定向回https://www.overleaf.com /login
复制保存在浏览器中的会话 cookie 时,请求可以正常工作。
我尝试在命令行中使用 cURL 做同样的事情,它在那里工作。
我相当确定 Overleaf 的服务器接受了我的身份验证请求,因为我曾尝试故意错误地发送密码或 csrf 令牌,并且在这两种情况下,响应都没有给我新的会话 cookie,而是发送旧的。
如果有人知道出了什么问题,我将非常感谢您的意见。
这就是在终端中起作用的方法,我正在尝试使用 node-fetch 在 javascript 中复制它:
curl -v --header "Content-Type: application/json" --cookie "GCLB=someothercookie;overleaf_session2=firstsessioncookie" --data '{"_csrf":"the_csrf_token", "email": "MYEMAIL", "password":"MYPASSWORD"}' https://www.overleaf.com/login
以获取 cookie 和 csrf 令牌并
curl -v https://www.overleaf.com/project --cookie "overleaf_session2=returnedsessioncookie; GCLB=someothercookie"
作为返回我的项目的 html 页面的请求。
这是我的 javascript 代码,我对它进行了双重、三重、四重检查,但我认为我遗漏了一些东西。
const fetch = require("node-fetch");
const parser = require("node-html-parser");
const scparser = require("set-cookie-parser");
async function run() {
const email = process.env.EMAIL;
const password = process.env.PASSWORD;
var cookies = await login(email, password);
console.log(await all_projects(cookies));
}
async function login(email, password) {
const login_get = await fetch("https://www.overleaf.com/login");
const get_cookies = login_get.headers.raw()["set-cookie"];
const parsed_get_cookies = scparser.parse(get_cookies, {
decodeValues: false
});
const overleaf_session2_get = parsed_get_cookies.find(
(element) => element.name == "overleaf_session2"
).value;
const gclb = parsed_get_cookies.find(
(element) => element.name == "GCLB"
).value;
console.log("overleaf_session2_get:", overleaf_session2_get, "gclb:", gclb);
const get_responsetext = await login_get.text();
const _csrf = parser
.parse(get_responsetext)
.querySelector("input[name=_csrf]")
.getAttribute("value");
login_json = { _csrf: _csrf, email: email, password: password };
console.log(login_json);
const login_post = await fetch("https://www.overleaf.com/login", {
method: "post",
body: JSON.stringify(login_json),
headers: {
"Content-Type": "application/json",
"Cookie": "GCLB=" + gclb + ";overleaf_session2=" + overleaf_session2_get
}
});
const post_cookies = login_post.headers.raw()["set-cookie"];
const parsed_post_cookies = scparser.parse(post_cookies, {
decodeValues: false
});
const overleaf_session2_post = parsed_post_cookies.find(
(element) => element.name == "overleaf_session2"
).value;
console.log(
"successful:",
overleaf_session2_get != overleaf_session2_post ? "true" : "false"
);
console.log(await fetch("https://www.overleaf.com/project", {
headers: {
"Cookie": "overleaf_session2=" + overleaf_session2_post
}
}))
return "overleaf_session2=" + overleaf_session2_post;
}
async function all_projects(cookies) {
const res = await fetch("https://www.overleaf.com/project", {
headers: {
Cookie: cookies
}
});
return res;
}
run();
解决方案
是的,您的身份验证请求可能是有效的,但这可能是一个安全问题,浏览器不允许您这样做并自由访问另一个网站的 cookie。
浏览器不允许您访问其他域的 cookie,如果他们这样做了,那么网络将是一个不安全的地方,因为例如 Stackoverflow 可以访问我的 Facebook 帐户 cookie 并提取我的个人信息。
推荐阅读
- python - 我们如何增加 pyqt5 QCombobox 下拉按钮的大小
- java - 春季安全CORS登录
- python - 获取类修饰函数的实例
- java - 将 JLabel 从一个 JPanel 拖到另一个 JPanel 时遇到问题
- javascript - AJAX not passing variable to PHP file
- angular - 具有不同 routerLinks 的 Angular 通知组件未根据输入重定向
- python - 二次公式一半的时间不起作用?
- wordpress - WooCommerce 重定向到上一页
- python-3.x - Flask + curl:使用 POST 请求触发特定路由
- javascript - 嵌套 div 上的选择性悬停背景更改