Skip to content

Commit 89b20de

Browse files
committed
Session cookie secure attribute
1 parent ea02080 commit 89b20de

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

src/sessions/middleware.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub struct SessionMiddleware<Store> {
5454
cookie_domain: Option<String>,
5555
session_ttl: Option<Duration>,
5656
save_unchanged: bool,
57+
secure: Option<bool>,
5758
same_site_policy: SameSite,
5859
key: Key,
5960
}
@@ -66,6 +67,7 @@ impl<Store: SessionStore> std::fmt::Debug for SessionMiddleware<Store> {
6667
.field("cookie_name", &self.cookie_name)
6768
.field("cookie_domain", &self.cookie_domain)
6869
.field("session_ttl", &self.session_ttl)
70+
.field("secure", &self.secure)
6971
.field("same_site_policy", &self.same_site_policy)
7072
.field("key", &"..")
7173
.field("save_unchanged", &self.save_unchanged)
@@ -91,7 +93,10 @@ where
9193
session.expire_in(ttl);
9294
}
9395

94-
let secure_cookie = request.url().scheme() == "https";
96+
let mut secure_cookie = request.url().scheme() == "https";
97+
if let Some(secure) = self.secure {
98+
secure_cookie = secure;
99+
}
95100
request.set_ext(session.clone());
96101

97102
let mut response = next.run(request).await;
@@ -140,6 +145,7 @@ impl<Store: SessionStore> SessionMiddleware<Store> {
140145
/// * cookie path: "/"
141146
/// * cookie name: "tide.sid"
142147
/// * session ttl: one day
148+
/// * secure: request.scheme == 'https'
143149
/// * same site: strict
144150
/// * save unchanged: enabled
145151
///
@@ -160,6 +166,7 @@ impl<Store: SessionStore> SessionMiddleware<Store> {
160166
/// .with_cookie_name("custom.cookie.name")
161167
/// .with_cookie_path("/some/path")
162168
/// .with_cookie_domain("www.rust-lang.org")
169+
/// .with_secure(true)
163170
/// .with_same_site_policy(SameSite::Lax)
164171
/// .with_session_ttl(Some(Duration::from_secs(1)))
165172
/// .without_save_unchanged(),
@@ -172,6 +179,7 @@ impl<Store: SessionStore> SessionMiddleware<Store> {
172179
cookie_path: "/".into(),
173180
cookie_name: "tide.sid".into(),
174181
cookie_domain: None,
182+
secure: None,
175183
same_site_policy: SameSite::Lax,
176184
session_ttl: Some(Duration::from_secs(24 * 60 * 60)),
177185
key: Key::derive_from(secret),
@@ -217,6 +225,14 @@ impl<Store: SessionStore> SessionMiddleware<Store> {
217225
self
218226
}
219227

228+
/// Sets the secure attribute of the cookie.
229+
/// Defaults to true if the incoming request scheme is 'https'
230+
/// Can optionally be set to true or false to override
231+
pub fn with_secure(mut self, secure: bool) -> Self {
232+
self.secure = Some(secure);
233+
self
234+
}
235+
220236
/// Sets the same site policy for the session cookie. Defaults to
221237
/// SameSite::Lax. See [incrementally better
222238
/// cookies](https://tools.ietf.org/html/draft-west-cookie-incrementalism-01)

tests/sessions.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ async fn test_customized_sessions() -> tide::Result<()> {
6464
.with_cookie_name("custom.cookie.name")
6565
.with_cookie_path("/nested")
6666
.with_cookie_domain("www.rust-lang.org")
67-
.with_same_site_policy(SameSite::Strict)
67+
.with_secure(true)
68+
.with_same_site_policy(SameSite::Lax)
6869
.with_session_ttl(Some(Duration::from_secs(1)))
6970
.without_save_unchanged(),
7071
);
@@ -99,7 +100,8 @@ async fn test_customized_sessions() -> tide::Result<()> {
99100
assert!(cookies.get("tide.sid").is_none());
100101
let cookie = &cookies["custom.cookie.name"];
101102
assert_eq!(cookie.http_only(), Some(true));
102-
assert_eq!(cookie.same_site(), Some(SameSite::Strict));
103+
assert_eq!(cookie.secure(), Some(true));
104+
assert_eq!(cookie.same_site(), Some(SameSite::Lax));
103105
assert_eq!(cookie.path(), Some("/nested"));
104106
assert_eq!(cookie.domain(), Some("www.rust-lang.org"));
105107
let cookie_value = cookie.value().to_string();

0 commit comments

Comments
 (0)