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,);