Skip to content

Commit bd97c0d

Browse files
committed
fix(docs): Simplify example code
1 parent dba0675 commit bd97c0d

File tree

7 files changed

+110
-89
lines changed

7 files changed

+110
-89
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ homepage = "https://github.com/LeoniePhiline/axum-csrf-sync-pattern"
99
license = "Apache-2.0"
1010
readme = "README.md"
1111

12-
version = "0.1.0"
12+
version = "0.1.1"
1313
edition = "2021"
1414

1515
[badges]

README.md

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -91,37 +91,40 @@ In each example directory, execute `cargo run`, then open [http://127.0.0.1:3000
9191
Configure your session and CSRF protection layer in your backend application:
9292

9393
```rust
94+
use async_session::MemoryStore;
95+
use axum::{
96+
body::Body,
97+
http::StatusCode,
98+
routing::{get, Router},
99+
};
100+
use axum_csrf_sync_pattern::{CsrfSynchronizerTokenLayer, RegenerateToken};
101+
use axum_sessions::SessionLayer;
94102
use rand::RngCore;
95103

96104
let mut secret = [0; 64];
97105
rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
98106

99-
async fn handler() -> axum::http::StatusCode {
100-
axum::http::StatusCode::OK
107+
async fn handler() -> StatusCode {
108+
StatusCode::OK
101109
}
102110

103-
let app = axum::Router::new()
104-
.route("/", axum::routing::get(handler).post(handler))
111+
let app = Router::new()
112+
.route("/", get(handler).post(handler))
105113
.layer(
106-
axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default()
114+
CsrfSynchronizerTokenLayer::default()
107115

108116
// Optionally, configure the layer with the following options:
109117

110118
// Default: RegenerateToken::PerSession
111-
.regenerate(axum_csrf_sync_pattern::RegenerateToken::PerUse)
119+
.regenerate(RegenerateToken::PerUse)
112120
// Default: "X-CSRF-TOKEN"
113-
.request_header("X-Custom-CSRF-Token-Client-Request-Header")
121+
.request_header("X-Custom-Request-Header")
114122
// Default: "X-CSRF-TOKEN"
115-
.response_header("X-Custom-CSRF-Token-Server-Response-Header")
123+
.response_header("X-Custom-Response-Header")
116124
// Default: "_csrf_token"
117-
.session_key("_custom_csrf_token_session_key")
125+
.session_key("_custom_session_key")
118126
)
119-
.layer(
120-
axum_sessions::SessionLayer::new(
121-
async_session::MemoryStore::new(),
122-
&secret
123-
)
124-
);
127+
.layer(SessionLayer::new(MemoryStore::new(), &secret));
125128

126129
// Use hyper to run `app` as service and expose on a local port or socket.
127130

@@ -139,7 +142,7 @@ Receive the token and send same-site requests, using your custom header:
139142
const test = async () => {
140143
// Receive CSRF token (Default response header name: 'X-CSRF-TOKEN')
141144
const token = (await fetch("/")).headers.get(
142-
"X-Custom-CSRF-Token-Server-Response-Header"
145+
"X-Custom-Response-Header"
143146
);
144147

145148
// Submit data using the token
@@ -148,7 +151,7 @@ const test = async () => {
148151
headers: {
149152
"Content-Type": "application/json",
150153
// Default request header name: 'X-CSRF-TOKEN'
151-
"X-Custom-CSRF-Token-Client-Request-Header": token,
154+
"X-Custom-Request-Header": token,
152155
},
153156
body: JSON.stringify({
154157
/* ... */
@@ -168,32 +171,36 @@ In each example directory, execute `cargo run`, then open [http://127.0.0.1:3000
168171
Configure your CORS layer, session and CSRF protection layer in your backend application:
169172

170173
```rust
174+
use async_session::MemoryStore;
175+
use axum::{
176+
body::Body,
177+
http::{header, Method, StatusCode},
178+
routing::{get, Router},
179+
};
180+
use axum_csrf_sync_pattern::{CsrfSynchronizerTokenLayer, RegenerateToken};
181+
use axum_sessions::SessionLayer;
171182
use rand::RngCore;
183+
use tower_http::cors::{AllowOrigin, CorsLayer};
172184

173185
let mut secret = [0; 64];
174186
rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
175187

176-
async fn handler() -> axum::http::StatusCode {
177-
axum::http::StatusCode::OK
188+
async fn handler() -> StatusCode {
189+
StatusCode::OK
178190
}
179191

180-
let app = axum::Router::new()
181-
.route("/", axum::routing::get(handler).post(handler))
192+
let app = Router::new()
193+
.route("/", get(handler).post(handler))
182194
.layer(
183195
// See example above for custom layer configuration.
184-
axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default()
185-
)
186-
.layer(
187-
axum_sessions::SessionLayer::new(
188-
async_session::MemoryStore::new(),
189-
&secret
190-
)
196+
CsrfSynchronizerTokenLayer::default()
191197
)
198+
.layer(SessionLayer::new(MemoryStore::new(), &secret))
192199
.layer(
193-
tower_http::cors::CorsLayer::new()
194-
.allow_origin(tower_http::cors::AllowOrigin::list(["https://www.example.com".parse().unwrap()]))
195-
.allow_methods([axum::http::Method::GET, axum::http::Method::POST])
196-
.allow_headers([axum::http::header::CONTENT_TYPE, "X-CSRF-TOKEN".parse().unwrap()])
200+
CorsLayer::new()
201+
.allow_origin(AllowOrigin::list(["https://www.example.com".parse().unwrap()]))
202+
.allow_methods([Method::GET, Method::POST])
203+
.allow_headers([header::CONTENT_TYPE, "X-CSRF-TOKEN".parse().unwrap()])
197204
.allow_credentials(true)
198205
.expose_headers(["X-CSRF-TOKEN".parse().unwrap()]),
199206
);

examples/cross-site/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "cross-site"
33
authors = ["LeoniePhiline <[email protected]>"]
4-
version = "0.1.0"
4+
version = "0.1.1"
55
edition = "2021"
66
publish = false
77

examples/cross-site/src/main.rs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1+
use std::net::SocketAddr;
2+
3+
use async_session::MemoryStore;
14
use axum::{
25
http::{header, Method, StatusCode},
36
response::IntoResponse,
7+
routing::{get, Router},
8+
Server,
49
};
10+
use axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer;
11+
use axum_sessions::SessionLayer;
512
use color_eyre::eyre::{self, eyre, WrapErr};
613
use rand::RngCore;
14+
use tower_http::cors::{AllowOrigin, CorsLayer};
715

816
#[tokio::main]
917
async fn main() -> eyre::Result<()> {
@@ -17,7 +25,7 @@ async fn main() -> eyre::Result<()> {
1725
.wrap_err("Failed to initialize tracing-subscriber.")?;
1826

1927
let frontend = async {
20-
let app = axum::Router::new().route("/", axum::routing::get(index));
28+
let app = Router::new().route("/", get(index));
2129

2230
// Visit "http://127.0.0.1:3000/" in your browser.
2331
serve(app, 3000).await;
@@ -27,24 +35,21 @@ async fn main() -> eyre::Result<()> {
2735
let mut secret = [0; 64];
2836
rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
2937

30-
let app = axum::Router::new()
31-
.route("/", axum::routing::get(get_token).post(post_handler))
32-
.layer(axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default())
33-
.layer(axum_sessions::SessionLayer::new(
34-
async_session::MemoryStore::new(),
35-
&secret,
36-
))
38+
let app = Router::new()
39+
.route("/", get(get_token).post(post_handler))
40+
.layer(CsrfSynchronizerTokenLayer::default())
41+
.layer(SessionLayer::new(MemoryStore::new(), &secret))
3742
.layer(
38-
tower_http::cors::CorsLayer::new()
39-
.allow_origin(tower_http::cors::AllowOrigin::list([
43+
CorsLayer::new()
44+
.allow_origin(AllowOrigin::list([
4045
// Allow CORS requests from our frontend.
4146
"http://127.0.0.1:3000".parse().unwrap(),
4247
]))
4348
// Allow GET and POST methods. Adjust to your needs.
4449
.allow_methods([Method::GET, Method::POST])
4550
.allow_headers([
4651
// Allow incoming CORS requests to use the Content-Type header,
47-
axum::http::header::CONTENT_TYPE,
52+
header::CONTENT_TYPE,
4853
// as well as the `CsrfSynchronizerTokenLayer` default request header.
4954
"X-CSRF-TOKEN".parse().unwrap(),
5055
])
@@ -63,9 +68,9 @@ async fn main() -> eyre::Result<()> {
6368
Ok(())
6469
}
6570

66-
async fn serve(app: axum::Router, port: u16) {
67-
let addr = std::net::SocketAddr::from(([127, 0, 0, 1], port));
68-
axum::Server::bind(&addr)
71+
async fn serve(app: Router, port: u16) {
72+
let addr = SocketAddr::from(([127, 0, 0, 1], port));
73+
Server::bind(&addr)
6974
.serve(app.into_make_service())
7075
.await
7176
.unwrap();

examples/same-site/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "same-site"
33
authors = ["LeoniePhiline <[email protected]>"]
4-
version = "0.1.0"
4+
version = "0.1.1"
55
edition = "2021"
66
publish = false
77

examples/same-site/src/main.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
use async_session::MemoryStore;
12
use axum::{
23
http::{header, StatusCode},
34
response::IntoResponse,
5+
routing::get,
6+
Server,
47
};
8+
use axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer;
9+
use axum_sessions::SessionLayer;
510
use color_eyre::eyre::{self, eyre, WrapErr};
611
use rand::RngCore;
712

@@ -20,15 +25,12 @@ async fn main() -> eyre::Result<()> {
2025
rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
2126

2227
let app = axum::Router::new()
23-
.route("/", axum::routing::get(index).post(handler))
24-
.layer(axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default())
25-
.layer(axum_sessions::SessionLayer::new(
26-
async_session::MemoryStore::new(),
27-
&secret,
28-
));
28+
.route("/", get(index).post(handler))
29+
.layer(CsrfSynchronizerTokenLayer::default())
30+
.layer(SessionLayer::new(MemoryStore::new(), &secret));
2931

3032
// Visit "http://127.0.0.1:3000/" in your browser.
31-
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
33+
Server::bind(&"0.0.0.0:3000".parse().unwrap())
3234
.serve(app.into_make_service())
3335
.await
3436
.unwrap();
@@ -44,6 +46,6 @@ async fn index() -> impl IntoResponse {
4446
)
4547
}
4648

47-
async fn handler() -> axum::http::StatusCode {
49+
async fn handler() -> StatusCode {
4850
StatusCode::ACCEPTED
4951
}

src/lib.rs

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -78,37 +78,40 @@
7878
//! Configure your session and CSRF protection layer in your backend application:
7979
//!
8080
//! ```rust
81+
//! use async_session::MemoryStore;
82+
//! use axum::{
83+
//! body::Body,
84+
//! http::StatusCode,
85+
//! routing::{get, Router},
86+
//! };
87+
//! use axum_csrf_sync_pattern::{CsrfSynchronizerTokenLayer, RegenerateToken};
88+
//! use axum_sessions::SessionLayer;
8189
//! use rand::RngCore;
8290
//!
8391
//! let mut secret = [0; 64];
8492
//! rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
8593
//!
86-
//! async fn handler() -> axum::http::StatusCode {
87-
//! axum::http::StatusCode::OK
94+
//! async fn handler() -> StatusCode {
95+
//! StatusCode::OK
8896
//! }
8997
//!
90-
//! let app = axum::Router::new()
91-
//! .route("/", axum::routing::get(handler).post(handler))
98+
//! let app = Router::new()
99+
//! .route("/", get(handler).post(handler))
92100
//! .layer(
93-
//! axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default()
101+
//! CsrfSynchronizerTokenLayer::default()
94102
//!
95103
//! // Optionally, configure the layer with the following options:
96104
//!
97105
//! // Default: RegenerateToken::PerSession
98-
//! .regenerate(axum_csrf_sync_pattern::RegenerateToken::PerUse)
106+
//! .regenerate(RegenerateToken::PerUse)
99107
//! // Default: "X-CSRF-TOKEN"
100-
//! .request_header("X-Custom-CSRF-Token-Client-Request-Header")
108+
//! .request_header("X-Custom-Request-Header")
101109
//! // Default: "X-CSRF-TOKEN"
102-
//! .response_header("X-Custom-CSRF-Token-Server-Response-Header")
110+
//! .response_header("X-Custom-Response-Header")
103111
//! // Default: "_csrf_token"
104-
//! .session_key("_custom_csrf_token_session_key")
112+
//! .session_key("_custom_session_key")
105113
//! )
106-
//! .layer(
107-
//! axum_sessions::SessionLayer::new(
108-
//! async_session::MemoryStore::new(),
109-
//! &secret
110-
//! )
111-
//! );
114+
//! .layer(SessionLayer::new(MemoryStore::new(), &secret));
112115
//!
113116
//! // Use hyper to run `app` as service and expose on a local port or socket.
114117
//!
@@ -125,15 +128,15 @@
125128
//! ```javascript
126129
//! const test = async () => {
127130
//! // Receive CSRF token (Default response header name: 'X-CSRF-TOKEN')
128-
//! const token = (await fetch('/')).headers.get('X-Custom-CSRF-Token-Server-Response-Header');
131+
//! const token = (await fetch('/')).headers.get('X-Custom-Response-Header');
129132
//!
130133
//! // Submit data using the token
131134
//! await fetch('/', {
132135
//! method: 'POST',
133136
//! headers: {
134137
//! 'Content-Type': 'application/json',
135138
//! // Default request header name: 'X-CSRF-TOKEN'
136-
//! 'X-Custom-CSRF-Token-Client-Request-Header': token,
139+
//! 'X-Custom-Request-Header': token,
137140
//! },
138141
//! body: JSON.stringify({ /* ... */ }),
139142
//! });
@@ -147,32 +150,36 @@
147150
//! Configure your CORS layer, session and CSRF protection layer in your backend application:
148151
//!
149152
//! ```rust
153+
//! use async_session::MemoryStore;
154+
//! use axum::{
155+
//! body::Body,
156+
//! http::{header, Method, StatusCode},
157+
//! routing::{get, Router},
158+
//! };
159+
//! use axum_csrf_sync_pattern::{CsrfSynchronizerTokenLayer, RegenerateToken};
160+
//! use axum_sessions::SessionLayer;
150161
//! use rand::RngCore;
162+
//! use tower_http::cors::{AllowOrigin, CorsLayer};
151163
//!
152164
//! let mut secret = [0; 64];
153165
//! rand::thread_rng().try_fill_bytes(&mut secret).unwrap();
154166
//!
155-
//! async fn handler() -> axum::http::StatusCode {
156-
//! axum::http::StatusCode::OK
167+
//! async fn handler() -> StatusCode {
168+
//! StatusCode::OK
157169
//! }
158170
//!
159-
//! let app = axum::Router::new()
160-
//! .route("/", axum::routing::get(handler).post(handler))
171+
//! let app = Router::new()
172+
//! .route("/", get(handler).post(handler))
161173
//! .layer(
162174
//! // See example above for custom layer configuration.
163-
//! axum_csrf_sync_pattern::CsrfSynchronizerTokenLayer::default()
164-
//! )
165-
//! .layer(
166-
//! axum_sessions::SessionLayer::new(
167-
//! async_session::MemoryStore::new(),
168-
//! &secret
169-
//! )
175+
//! CsrfSynchronizerTokenLayer::default()
170176
//! )
177+
//! .layer(SessionLayer::new(MemoryStore::new(), &secret))
171178
//! .layer(
172-
//! tower_http::cors::CorsLayer::new()
173-
//! .allow_origin(tower_http::cors::AllowOrigin::list(["https://www.example.com".parse().unwrap()]))
174-
//! .allow_methods([axum::http::Method::GET, axum::http::Method::POST])
175-
//! .allow_headers([axum::http::header::CONTENT_TYPE, "X-CSRF-TOKEN".parse().unwrap()])
179+
//! CorsLayer::new()
180+
//! .allow_origin(AllowOrigin::list(["https://www.example.com".parse().unwrap()]))
181+
//! .allow_methods([Method::GET, Method::POST])
182+
//! .allow_headers([header::CONTENT_TYPE, "X-CSRF-TOKEN".parse().unwrap()])
176183
//! .allow_credentials(true)
177184
//! .expose_headers(["X-CSRF-TOKEN".parse().unwrap()]),
178185
//! );

0 commit comments

Comments
 (0)