@@ -6,7 +6,11 @@ use axum::{
66 response:: { IntoResponse , Redirect , Response } ,
77 routing:: get,
88} ;
9- use axum_extra:: { TypedHeader , headers, typed_header:: TypedHeaderRejectionReason } ;
9+ use axum_extra:: {
10+ TypedHeader ,
11+ headers:: { self , Authorization , authorization:: Bearer } ,
12+ typed_header:: TypedHeaderRejectionReason ,
13+ } ;
1014use chrono:: { Duration , Utc } ;
1115use http:: request:: Parts ;
1216use oauth2:: {
@@ -203,6 +207,25 @@ where
203207 async fn from_request_parts ( parts : & mut Parts , state : & S ) -> Result < Self , Self :: Rejection > {
204208 let store = CampsiteApiStore :: from_ref ( state) ;
205209
210+ // Try Bearer Token for CLI authentication
211+ if let Ok ( TypedHeader ( Authorization ( bearer) ) ) =
212+ parts. extract :: < TypedHeader < Authorization < Bearer > > > ( ) . await
213+ {
214+ let token = bearer. token ( ) . to_string ( ) ;
215+ match store. load_user_from_token ( token) . await {
216+ Ok ( Some ( user) ) => return Ok ( user) ,
217+ Ok ( None ) => {
218+ tracing:: error!( "Invalid or expired bearer token" ) ;
219+ return Err ( AuthRedirect ) ;
220+ }
221+ Err ( e) => {
222+ tracing:: error!( "Error validating bearer token: {:?}" , e) ;
223+ return Err ( AuthRedirect ) ;
224+ }
225+ }
226+ }
227+
228+ // Fall back to Cookie Session (UI)
206229 let cookies = parts
207230 . extract :: < TypedHeader < headers:: Cookie > > ( )
208231 . await
@@ -217,15 +240,16 @@ where
217240 let session_cookie = cookies. get ( CAMPSITE_API_COOKIE ) . ok_or ( AuthRedirect ) ?;
218241
219242 // Load user from external API
220- let user = store
221- . load_user_from_api ( session_cookie. to_string ( ) )
222- . await
223- . map_err ( |e| {
224- tracing:: error!( "load_user_from_api error: {:?}" , e) ;
225- AuthRedirect
226- } ) ?
227- . ok_or ( AuthRedirect ) ?;
228-
229- Ok ( user)
243+ match store. load_user_from_api ( session_cookie. to_string ( ) ) . await {
244+ Ok ( Some ( user) ) => Ok ( user) ,
245+ Ok ( None ) => {
246+ tracing:: error!( "Invalid or expired session cookie" ) ;
247+ Err ( AuthRedirect )
248+ }
249+ Err ( e) => {
250+ tracing:: error!( "Error loading user from cookie session: {:?}" , e) ;
251+ Err ( AuthRedirect )
252+ }
253+ }
230254 }
231255}
0 commit comments