如何使用node-fetch发送cookie?

时间:2016-01-15 16:42:56

标签: javascript node.js fetch

我有nodejs应用程序处理用户的请求并接收我想代理内部API服务的cookie。如何使用node-fetch来解决这个问题?

请不要提供超级费用。

4 个答案:

答案 0 :(得分:27)

您应该可以通过在请求标题中设置Cookie来传递Cookie:

const opts = {
    headers: {
        cookie: 'accessToken=1234abc; userId=1234'
    }
};
const result = await fetch(`/some/url`, opts);

答案 1 :(得分:0)

简单来说,您可以编写一个中间件,其中包含对global.fetch的cookie,如下所示。

const realFetch = fetch;

function cookieFetch(fetch, cookie) {
  return (url, opts) => {
    opts = opts || {};
    return fetch(url, Object.assign(opts, {
      headers: Object.assign(opts.headers || {}, { cookie })
    }));
  };
}

function middleware(req, res, next) {
  const kuki = req.headers.cookie;
  global.fetch = kuki ?
    cookieFetch(realFetch, kuki) :
    realFetch;
  next();
}

module.exports = middleware;

答案 2 :(得分:0)

像机器人一样读写Cookie

async function login() {
  return fetch('<some_url>/login', {
      'headers': {
          'accept': '*/*',
          'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
          'cookie': '',,
      },
      'body': 'username=foo&password=bar',
      'method': 'POST',
  });
}

(async() => {
  const loginResponse = await login();
  const loginCookies = parseCookies(loginResponse);
})();

您可能希望包括:accept-languageuser-agentrefereraccept-encoding等(在Chrome DevTools上检查示例请求)

由于某种原因,节点获取请求的结果cookie与新请求不兼容,但是我们可以这样解析它们:

function parseCookies(response) {
  const raw = response.headers.raw()['set-cookie'];
  return raw.map((entry) => {
    const parts = entry.split(';');
    const cookiePart = parts[0];
    return cookiePart;
  }).join(';');
}

在以后的请求中通过相同的标头传递cookie:

  return fetch('<some_url>/dashboard', {
    'headers': {
        'accept': '*/*',
        'cookie': parsedCookies,
    },
    'method': 'GET',
  });

答案 3 :(得分:-4)

您不需要节点功能,您可以从请求标题&#34; Cookie&#34;中读取用户Cookie。见https://nodejs.org/dist/latest-v5.x/docs/api/http.html#http_message_headers

但是,如果您使用跨域请求,则必须使用withCredential配置客户端请求并在服务器上添加CORS标头。请参阅:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS