I’m having trouble with CSRF protection in my Express app. I’ve set up the middleware correctly and it works when I test it with Postman, but when I try to make requests from my React frontend, I keep getting an invalid CSRF token error.
Here’s my Express server setup:
const csrfMiddleware = require('csurf');
const cookies = require('cookie-parser');
const tokenProtection = csrfMiddleware({
cookie: {
httpOnly: true,
maxAge: 3600
}
});
app.use(cookies());
app.use(tokenProtection);
app.get('/api/get-csrf', (request, response) => {
response.json({ token: request.csrfToken() });
});
And here’s my React frontend code:
useEffect(() => {
const fetchCsrfToken = async () => {
const response = await apiClient.get('/api/get-csrf');
apiClient.defaults.headers.post['X-CSRF-Token'] = response.data.token;
};
fetchCsrfToken();
}, []);
const submitForm = (event) => {
event.preventDefault();
apiClient.post('/api/signin', {
headers: {
'Content-Type': 'application/json'
},
data: { username, password },
}).then((response) => {
if (response.data.authToken) {
localStorage.setItem('authToken', response.data.authToken);
window.location.href = '/dashboard';
}
}).catch((error) => {
console.log(error);
});
}
The server keeps returning: ForbiddenError: invalid csrf token. What could be causing this issue?