Skip to content

CSRF Protection

Cross-Site Request Forgery (CSRF) Protection

Accella has built-in CSRF protection. When sending POST or other non-GET requests, you must include the appropriate token in the request, or an InvalidAuthenticityToken error will occur. If you use the framework features to create forms, the CSRF token is automatically generated and included in the request.

Creating Forms Without Framework Features

If you are creating a form manually, use the CsrfTokenField component to include the token as shown below.

---
import CsrfTokenField from "accel-web/form/CsrfTokenField.astro";
---
<form method="POST">
<CsrfTokenField />
<!-- ... -->
</form>

Using CSRF Tokens in Ajax Requests

Use the CsrfMetaTags component in your layout file to generate meta tags. Set the token from these meta tags in the X-CSRF-Token request header.

---
import { CsrfMetaTags } from "accel-web";
---
<!-- ... -->
<head>
<CsrfMetaTags />
<!-- Meta tags like the following will be generated:
<meta name="csrf-param" content="authenticity_token">
<meta name="csrf-token" content="xxxx">
-->
</head>
<!-- ... -->

Helper Functions for AuthenticityToken

defineAuthenticityToken and validateAuthenticityToken are used to prepare and validate tokens for requests. These are used within the Astro middleware provided by Accella.

import { RequestParameters } from "accel-web";
import { defineAuthenticityToken, validateAuthenticityToken } from "accel-web/csrf";
import { APIContext } from "astro";
import { getSession } from "./session";
export const onRequest = async (context: APIContext, next: any) => {
const { cookies, request, params, locals } = context;
locals.session = getSession(cookies);
locals.params = await RequestParameters.from(request, params);
defineAuthenticityToken(locals, locals.session);
validateAuthenticityToken(locals.params, locals.session, request);
return await next();
};

When defineAuthenticityToken is executed, the token can be accessed via Astro.locals.authenticityToken. This token is automatically embedded when generating forms using formFor.

validateAuthenticityToken validates the authenticity token for POST, PUT, PATCH, and DELETE requests. If the tokens do not match, an InvalidAuthenticityToken exception is thrown.