v0.5.173: OIDC state всегда, CSRF смонтирован, session.regenerate

This commit is contained in:
2026-06-22 19:22:42 +04:00
parent e943b33a04
commit 0135d28189
7 changed files with 25 additions and 15 deletions
+9 -8
View File
@@ -32,15 +32,11 @@ function createRouter({ auth, doubleCsrfProtection, generateCsrfToken, authLimit
router.get('/callback', async (req, res) => {
const { code, state } = req.query;
// Проверка state — защита от CSRF в OAuth-потоке
if (process.env.NODE_ENV === 'production') {
if (req.session) delete req.session.oidcState;
} else {
if (!state || state !== req.session.oidcState) {
return res.status(403).send('Invalid state parameter');
}
delete req.session.oidcState;
// Проверка state — защита от CSRF в OAuth-потоке (всегда)
if (!state || state !== req.session.oidcState) {
return res.status(403).send('Invalid state parameter');
}
delete req.session.oidcState;
if (!code) {
return res.status(400).send('Missing authorization code');
@@ -57,6 +53,11 @@ function createRouter({ auth, doubleCsrfProtection, generateCsrfToken, authLimit
const payload = jwt.decode(accessToken);
if (!payload) throw new Error('Failed to decode token');
// Регенерируем ID сессии — защита от session fixation
await new Promise((resolve, reject) => {
req.session.regenerate(err => err ? reject(err) : resolve());
});
req.session.token = accessToken;
req.session.idToken = tokenData.idToken || null;