Cookies для неаутентифицированных пользователей - PullRequest
0 голосов
/ 04 мая 2020

Я подал заявку и хотел бы предоставить даже не прошедшим проверку пользователям некоторые функции.

Пока у меня есть рабочий интерфейс React, сервер Express и Passport Js, которые обрабатывают аутентификацию / авторизацию пользователей.

Пока только пользователи, вошедшие в систему, получили cook ie, у которого был свой идентификатор хранилища сеансов.

Я изменил конфигурацию сеанса, чтобы включить saveUninitialized в true, и теперь каждый клиент, который получает доступ к веб-сайту, получает набор Cook ie, и я могу обеспечить работоспособность, как и ожидалось.

Проблема заключается в том, что некоторые запросы, которые клиентский интерфейс делает к внутреннему, хранилище сеансов хранит "призрачные" сеансы. Под этим я подразумеваю всплывающие сеансы, которые не были установлены клиентами, которые подключались к серверной части - я просматривал каждый запрос для sessionID, и он оставался таким же для запросов клиентов / клиентов тоже cook ie имеет то же значение.

Например, мой маршрут createLobby будет генерировать "призрачный" сеанс в дополнение к обычному клиентскому сеансу, в то время как мой маршрут deleteLobby работает, как и ожидалось.

I Я не уверен, откуда берутся "призрачные" сессии / что делает запрос для их создания.

Express Сессия

app.use(
  session({
    name: 'SESS_ID',
    cookie: {
      httpOnly: true,
      secure: app.get('env') === 'development' ? false : true,
      maxAge: 1000 * 60 * 60 * 24,
    },
    secret: keys.session.secret,
    store,
    resave: false,
    saveUninitialized: true,
  })
);

Реагировать Создать компонент лобби

import React, { useState, useRef, useEffect } from 'react';
import { BACKEND_URL } from 'GConfig';
import NewLobbies from './components/newLobby';

const Play = () => {
  const [creatingLobby, setCreatingLobby] = useState(0);
  const lobbyNameRef = useRef();
  const lobbyPasswordRef = useRef();

  useEffect(() => {
    const createLobby = async () => {
      const [error, lobbyId] = await (
        await fetch(`${BACKEND_URL}/play/createLobby`, {
          method: 'POST',
          credentials: 'include',
          headers: {
            'Content-type': 'application/json',
          },
          body: JSON.stringify({
            lobbyName: lobbyNameRef.current.value,
            lobbyPassword: lobbyPasswordRef.current.value,
          }),
        })
      ).json();
      if (error) {
        console.error(new Error(error));
        return;
      }
      console.log(lobbyId)
      // TODO : JOIN LOBBY WITH LOBBY ID
    };
    if (creatingLobby > 0) {
      createLobby();
      setCreatingLobby(0);
    }
  }, [creatingLobby]);
  return (
    <>
      <NewLobbies />

      <label htmlFor='lobbyName'>
        Create Lobby with Name :
        <input
          ref={lobbyNameRef}
          type='text'
          name='lobbyName'
          placeholder='Create a lobby with this name ...'
          required
        />
      </label>
      <label htmlFor='lobbyPassword'>
        Lobby Password :
        <input
          ref={lobbyPasswordRef}
          type='password'
          name='lobbyPassword'
          placeholder="Leave this empty if you don't want your lobby to be open to everyone"
        />
      </label>
      <button type='button' onClick={() => setCreatingLobby(s => s + 1)}>
        Create Lobby
      </button>
    </>
  );
};

export default Play;

Express Маршрут

// Working route
router.post('/deleteLobby/:id', async (req, res) => {
  if (!req.params.id) {
    return res.json({ error: 'No ID on request' });
  }
  const user = req.user ? req.user.id : req.session.id;
  try {
    const result = await Lobby.findById(req.params.id);
    if (result.owner === user) {
      await Lobby.findByIdAndDelete(req.params.id);
      return res.json({
        success: `Lobby with ID : ${req.params.id} has been successfully removed`,
      });
    }
  } catch (e) {
    return res.json({
      error: [`No Lobby with ID found : ${req.params.id}`, e.message],
    });
  }
});

// Not working route

router.post('/createLobby', async (req, res) => {
  // validation
  console.log(req);
  res.send(await createLobby(req));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...