use crate::config::AuthConfig;
use cookie::{Cookie, SameSite as CookieSameSite};
pub fn create_session_cookie(token: &str, config: &AuthConfig) -> String {
let session_config = &config.session;
let expires_offset = cookie::time::OffsetDateTime::now_utc()
+ cookie::time::Duration::seconds(session_config.expires_in.num_seconds());
let same_site = map_same_site(&session_config.cookie_same_site);
let mut cookie = Cookie::build((&*session_config.cookie_name, token))
.path("/")
.expires(expires_offset)
.secure(session_config.cookie_secure)
.http_only(session_config.cookie_http_only)
.same_site(same_site);
if matches!(
session_config.cookie_same_site,
crate::config::SameSite::None
) {
cookie = cookie.secure(true);
}
cookie.build().to_string()
}
pub fn create_clear_session_cookie(config: &AuthConfig) -> String {
let session_config = &config.session;
let same_site = map_same_site(&session_config.cookie_same_site);
let mut cookie = Cookie::build((&*session_config.cookie_name, ""))
.path("/")
.expires(cookie::time::OffsetDateTime::UNIX_EPOCH)
.secure(session_config.cookie_secure)
.http_only(session_config.cookie_http_only)
.same_site(same_site);
if matches!(
session_config.cookie_same_site,
crate::config::SameSite::None
) {
cookie = cookie.secure(true);
}
cookie.build().to_string()
}
fn map_same_site(s: &crate::config::SameSite) -> CookieSameSite {
match s {
crate::config::SameSite::Strict => CookieSameSite::Strict,
crate::config::SameSite::Lax => CookieSameSite::Lax,
crate::config::SameSite::None => CookieSameSite::None,
}
}