···3434use axum_htmx::{HxBoosted, HxRedirect, HxRequest};
3535use axum_template::RenderHtml;
3636use chrono::{Duration, Utc};
3737+use cookie::time::OffsetDateTime;
3738use http::StatusCode;
3839use minijinja::context as template_context;
3940use rand::{Rng, distr::Alphanumeric};
···759760760761 let cookie_value: String = session_cookie.try_into()?;
761762763763+ let mut cookie_expires = OffsetDateTime::now_utc();
764764+ cookie_expires += Duration::weeks(52);
765765+762766 let mut cookie = Cookie::new(AUTH_COOKIE_NAME, cookie_value);
763767 cookie.set_domain(web_context.config.external_base.clone());
764768 cookie.set_path("/");
765769 cookie.set_http_only(true);
766770 cookie.set_secure(true);
767771 cookie.set_max_age(Some(cookie::time::Duration::days(365))); // Longer expiry since we have refresh tokens
772772+ cookie.set_expires(cookie_expires);
768773 cookie.set_same_site(Some(SameSite::Lax));
769774770775 let updated_jar = jar.add(cookie);
···908913909914 let cookie_value: String = new_session.try_into()?;
910915916916+ let mut cookie_expires = OffsetDateTime::now_utc();
917917+ cookie_expires += Duration::weeks(52);
918918+911919 let mut cookie = Cookie::new(AUTH_COOKIE_NAME, cookie_value);
912920 cookie.set_domain(web_context.config.external_base.clone());
913921 cookie.set_path("/");
914922 cookie.set_http_only(true);
915923 cookie.set_secure(true);
916916- cookie.set_max_age(Some(cookie::time::Duration::days(30)));
924924+ cookie.set_max_age(Some(cookie::time::Duration::days(365))); // Longer expiry since we have refresh tokens
925925+ cookie.set_expires(cookie_expires);
917926 cookie.set_same_site(Some(SameSite::Lax));
918927919928 let updated_jar = jar.add(cookie);
-9
src/http/middleware_auth.rs
···128128 if let Some(session_cookie) = session {
129129 trace!(did = %session_cookie.did, "Found session cookie");
130130131131- // Check if token is expired
132132- if session_cookie.is_expired() {
133133- debug!(did = %session_cookie.did, "Session token expired");
134134- // Token is expired, but we could potentially refresh it
135135- // For now, treat as unauthenticated and let user re-login
136136- // A more sophisticated approach would auto-refresh here
137137- return Ok(Auth::Unauthenticated);
138138- }
139139-140131 // Look up the user's profile from the database
141132 match crate::storage::identity_profile::handle_for_did(
142133 &web_context.pool,