Получение ошибки 401 Unauthorized при входе в React Web App
Когда я нажимаю на кнопку входа на моей веб-странице, построенной с помощью vite-react(frontend:5173), express(server 5000, для обработки cookies httpOnly) и Django(backend:8080). консоль выдает ошибку (GET http://localhost:5000/api/users/me 401 (Unauthorized)). Django терминал с помощью VS Code также выдает ту же ошибку. Я сузил проблему, что это между React и экспресс-сервером. Я также использую redux-toolkit для проекта, и вот часть редуктора, который я использую для обработки получения пользователя
const getUser = createAsyncThunk(
'users/me',
async (\_, thunkAPI) =\> {
try{
//const accessToken = thunkAPI.getState().auth.accessToken;
const res = await fetch(`${import.meta.env.VITE_API_URL}/api/users/me`, {
method: 'GET',
headers: {
Accept: 'application/json',
//Authorization: `Bearer ${accessToken}`,
}
})
const data = await res.json();
if(res.status === 200){
return data;
} else {
return thunkAPI.rejectWithValue(data);
}
} catch(err){
return thunkAPI.rejectWithValue(err.response.data);
}
}
)
VITE_API_URL в моем окружении указывает на localhost:5000.
Вся ошибка исчезает, если я удаляю accessToken и заголовок Authorization, но мне кажется, что это не нужно, если я использую httpOnly, а не локальное хранилище для токенов, и я обрабатываю куки уже в моем 'me express router'. Вот мой 'me router' для express
import express from 'express';
import fetch from 'node-fetch';
const router = express.Router();
router.get('/api/users/me', async (req, res) =\> {
const { access } = req.cookies;
try{
const apiRes = await fetch(`${process.env.API_URL}/api/users/me`, {
method: 'GET',
headers: {
Accept: 'application/json',
Authorization: `Bearer ${access}`,
}
});
const data = await apiRes.json();
return res.status(apiRes.status).json(data);
} catch(err){
return res.status(500).json({
error: 'Something went wrong when trying to retrieve user'
});
}
})
export default router;
тогда я использую cookieParser в моем index.js и API_URL подключается к localhost:8080 проверено с postman и это работает.
Настройте свой App.js или главный экспресс-файл, используя CORS, или просто используйте сам экспресс-сервер для получения данных для входа в систему из любой БД
import express from 'express';
const router = express.Router();
router.get('/api/users/me', async (req, res) =\> {
try{
//If mongo - configure DB connection
const apiRes = await loginCollectionName.findOne({someId:ID});
if(apiRes){
return res.status(200).json("Login Success");
}
} catch(err){
return res.status(500).json({
error: 'Something went wrong when trying to retrieve user'
});
}
})
export default router;
Мой основной файл экспресс-сервера использует cors. нужно ли мне передавать аргументы моему cors?
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
dotenv.config();
const app = express();
app.use(cors());
app.use(express.json());
app.use(cookieParser());
app.use(loginRoute);
app.use(logoutRoute);
app.use(meRoute);
app.use(registerRoute);
app.get('*', (req, res) => {
const indexPath = join(__dirname, 'client', 'dist', 'index.html');
return res.sendFile(indexPath);
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server listening on port ${PORT}`));