Я подал заявку и хотел бы предоставить даже не прошедшим проверку пользователям некоторые функции.
Пока у меня есть рабочий интерфейс 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));
});