首页 > 解决方案 > 来自节点获取的会话 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();

标签: javascriptnode.jshttpcookiesnode-fetch

解决方案


是的,您的身份验证请求可能是有效的,但这可能是一个安全问题,浏览器不允许您这样做并自由访问另一个网站的 cookie。

浏览器不允许您访问其他域的 cookie,如果他们这样做了,那么网络将是一个不安全的地方,因为例如 Stackoverflow 可以访问我的 Facebook 帐户 cookie 并提取我的个人信息。


推荐阅读