Checking CSRF Tokens

How to check CSRF tokens in your Next.js Firebase API routes using the "withCsrf" HOC.

You can use the withCsrf HOC to ensure only users with a valid CSRF token can access your API routes.

The CSRF token must be sent in the x-csrf-token header of the request. If the token is not present, or if it's invalid, the request will be rejected.

pages/api/hello.ts
import { NextApiRequest, NextApiResponse } from "next"; import { withAuthedUser } from '~/core/middleware/with-authed-user'; import { withMethodsGuard } from '~/core/middleware/with-methods-guard'; import { withPipe } from '~/core/middleware/with-pipe'; import withCsrf from "./with-csrf"; function helloWorldHandler( req: NextApiRequest, res: NextApiResponse ) { res.status(200).json({ text: 'Hello' }) } export default withPipe( withAuthedUser, withMethodsGuard(['POST']), withCsrf(), helloWorldHandler, );

If you pass the CSRF token in different ways, you can pass a function to the withCsrf HOC to retrieve the token from the request.

pages/api/hello.ts
import { NextApiRequest, NextApiResponse } from "next"; import { withAuthedUser } from '~/core/middleware/with-authed-user'; import { withMethodsGuard } from '~/core/middleware/with-methods-guard'; import { withPipe } from '~/core/middleware/with-pipe'; import withCsrf from "./with-csrf"; async function helloWorldHandler( req: NextApiRequest, res: NextApiResponse ) { await withCsrf(req, () => req.body.csrfToken); res.status(200).json({ text: 'Hello' }) } export default withPipe( withAuthedUser, withMethodsGuard(['POST']), helloWorldHandler, );

Subscribe to our Newsletter
Get the latest updates about React, Remix, Next.js, Firebase, Supabase and Tailwind CSS