flwo / apps /server /src /middleware /csrf.js
moustafa7's picture
refactor: part 1 technical improvements - logging, response standards, caching, soft delete
05cee1f
Raw History Blame Contribute Delete
1.19 kB
import Tokens from 'csrf'
import { AppError } from '../lib/AppError.js'
const tokens = new Tokens()
const SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']
const CSRF_COOKIE = 'csrf-token'
export function csrfProtection(req, res, next) {
if (SAFE_METHODS.includes(req.method)) return next()
const secret = req.cookies?.[CSRF_COOKIE]
const token = req.headers['x-csrf-token'] || req.body?._csrf
if (!secret || !token) {
return next(new AppError('طلب غير مصرح به (CSRF)', 403, 'CSRF_MISSING'))
}
if (!tokens.verify(secret, token)) {
return next(new AppError('طلب غير مصرح به (CSRF)', 403, 'CSRF_INVALID'))
}
next()
}
export function csrfTokenMiddleware(req, res) {
const existing = req.cookies?.[CSRF_COOKIE]
if (existing && tokens.verify(existing, req.cookies?.[CSRF_COOKIE] || '')) {
return res.json({ csrfToken: tokens.create(existing) })
}
const secret = tokens.secretSync()
res.cookie(CSRF_COOKIE, secret, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax',
path: '/',
})
res.json({ csrfToken: tokens.create(secret) })
}