Файлы cookie в заголовке, но не полученные на серверной части

#javascript #node.js #express #cookies #next.js

#javascript #node.js #выразить #файлы cookie #next.js

Вопрос:

Чтобы было проще, у меня есть ПОРТ Node.js / express: 3001 API и интерфейсный ПОРТ nextjs: 3000, кажется, все работает нормально, пока я не решил использовать файлы cookie для хранения JWT, а затем отправлять его обратно в API с каждым запросом.

Когда пользователь входит в систему из браузера, у меня есть это (на экспресс) для файла cookie:

       res.cookie("JWT_TOKEN", token, {
        maxAge: 7000 * 40 *60*60, // just for testing
        httpOnly: false,
        domain: 'localhost',
        path: '/',
        signed: false,
        secure: false,
      });
 

И в браузере устанавливается файл cookie.

Но мне абсолютно не повезло с получением cookie обратно, я вижу его в заголовках, но не в express.

Это в части nextjs:

 export async function getServerSideProps(ctx) {
  const {
    query: { page = 1 },
  } = ctx;
  console.log(ctx.req.headers);
  try {
    const { data } = await axios.get(
      `http://localhost:3001/api/movies?page=${page}`,
      { headers: { Authorization: "Bearer test" } },
      { withCredentials: true }
    );
    return {
      props: data,
    };
  } catch (error) {
    return {
      notFound: true,
    };
  }
}
 

Так что в ctx.req.headers есть файл cookie

 {
  host: 'localhost:3000',
  connection: 'keep-alive',
  'sec-ch-ua': '"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"',
  'sec-ch-ua-mobile': '?0',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
  accept: '*/*',
  'sec-fetch-site': 'same-origin',
  'sec-fetch-mode': 'cors',
  'sec-fetch-dest': 'empty',
  referer: 'http://localhost:3000/movies',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-GB,en;q=0.9,it-IT;q=0.8,it;q=0.7',
  cookie: 'JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNjA4ODk5Njg4fQ.9b9Nl5FWynXa38o-VJyT_B8vBeSk6WyBoPeuv_6GLSo'
}
 

Но на сервере, используя анализатор файлов cookie, я получаю ответ: (регистрация файлов cookie и req.headers)

 [Object: null prototype] {}
{
  accept: 'application/json, text/plain, */*',
  authorization: 'Bearer asd',
  'user-agent': 'axios/0.21.0',
  host: 'localhost:3001',
  connection: 'close'
}
 

Наконец, я попытался из postman установить несколько файлов cookie, и это работает!

 {
  POSTMAN: 'ALL_GOOD',
  JWT_TOKEN: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNjA4OTAwMzE2fQ.56DBF0xw2_dHy16dANwQlIkuX_zhUZMaTcDqLv7kyv4'
}
{
  'user-agent': 'PostmanRuntime/7.26.8',
  accept: '*/*',
  'cache-control': 'no-cache',
  'postman-token': '0cea19b2-16a0-46f2-a311-d4d28f04d42a',
  host: 'localhost:3001',
  'accept-encoding': 'gzip, deflate, br',
  connection: 'keep-alive',
  cookie: 'POSTMAN=ALL_GOOD; JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNjA4OTAwMzE2fQ.56DBF0xw2_dHy16dANwQlIkuX_zhUZMaTcDqLv7kyv4'
}
 

Так что либо я делаю что-то неправильно, что более чем вероятно, поскольку я немного запутался в аутентификации и авторизации, либо я что-то упускаю из виду в том, как работает nextjs. Одна вещь, которую я заметил, — это URL-адрес на вкладке сеть, запрос будет

 Request URL: http://localhost:3000/_next/data/development/movies.json
 

вместо того , чтобы http://localhost:3001/api/movies

Но кроме этого я заблудился.

Я мог бы сделать что-то вроде этого

     const { data } = await axios.get(
      `http://localhost:3001/api/movies?page=${page}`,
      { headers: { Authorization: `Bearer ${ctx.req.headers.cookie}`, cookie:  ctx.req.headers.cookie} },
      { withCredentials: true }
    );
 

И теперь у меня есть доступ к нему в express, но по какой-то причине это кажется неправильным, поскольку файл cookie уже находится в заголовках.

Есть идеи о том, что происходит?

Ответ №1:

Используете ли вы анализатор файлов cookie?

 var express = require('express')
var cookieParser = require('cookie-parser')

var app = express()
app.use(cookieParser())
 

Тогда вы можете использовать

 app.get('/', function (req, res) {
   console.log('Cookies: ', req.cookies)
})
 

Комментарии:

1. Эй, да, это то, что я использую, но я говорил, что, несмотря ни на что, я могу видеть файлы cookie из NextJS.

Ответ №2:

Файлы cookie доступны только локально на компьютере пользователя. Вы не можете извлечь их файлы cookie через свой сервер. Вам нужна база данных, и это будет означать, что вы не можете использовать файлы cookie для хранения. Используйте firebase Google, поскольку записывать данные очень просто. Таким образом, вам не придется использовать длинные серверные алгоритмы!

Комментарии:

1. На самом деле это не имеет смысла, файлы cookie отправляются туда и обратно, они должны иметь какое-то состояние.