簡體   English   中英

如何使用 node-fetch 發送 cookie?

[英]How to send cookies with node-fetch?

我有 nodejs 應用程序,它處理用戶的請求並接收我想代理到內部 API 服務的 cookie。 如何使用節點獲取來解決這個問題?

請不要提供超級代理。

您應該能夠通過在請求標頭中設置來傳遞 cookie:

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

像機器人一樣讀寫 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',
  });

為簡單起見,您可以編寫一個中間件,將 cookie 包含到 global.fetch,如下所示。

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;

您不需要node-featch,您可以從請求標題“Cookie”中讀取用戶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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM