| Crates.io | axum-tower-sessions-csrf |
| lib.rs | axum-tower-sessions-csrf |
| version | 0.1.1 |
| created_at | 2025-12-11 23:25:18.691023+00 |
| updated_at | 2025-12-11 23:45:08.814178+00 |
| description | CSRF protection for Axum using tower-sessions with the Synchronizer Token Pattern |
| homepage | |
| repository | https://github.com/cavebatsofware/axum-tower-sessions-csrf |
| max_upload_size | |
| id | 1980742 |
| size | 49,153 |
CSRF protection for Axum using tower-sessions, implementing the Synchronizer Token Pattern as recommended by OWASP.
[dependencies]
axum-tower-sessions-csrf = "0.1"
tower-sessions = "0.14"
use axum::{routing::{get, post}, Router};
use axum::middleware::from_fn;
use tower_sessions::{MemoryStore, SessionManagerLayer};
use axum_tower_sessions_csrf::CsrfMiddleware;
#[tokio::main]
async fn main() {
// Setup session layer
let session_store = MemoryStore::default();
let session_layer = SessionManagerLayer::new(session_store);
// Build your app with CSRF protection
let app = Router::new()
.route("/", get(index))
.route("/submit", post(submit))
.layer(from_fn(CsrfMiddleware::middleware)) // Add CSRF middleware
.layer(session_layer); // Session layer must be last
// Run your server...
}
use tower_sessions::Session;
use axum::Json;
use axum_tower_sessions_csrf::get_or_create_token;
async fn get_token(session: Session) -> Result<Json<String>, String> {
let token = get_or_create_token(&session).await?;
Ok(Json(token))
}
// Fetch CSRF token
const response = await fetch('/api/csrf-token');
const { token } = await response.json();
// Include in state-changing requests
await fetch('/api/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-csrf-token': token, // Required header
},
body: JSON.stringify(data),
});
x-csrf-token header on POST/PUT/DELETE/PATCHLicensed under either of:
at your option.
Contributions are welcome! Please feel free to submit a Pull Request.