@@ -871,6 +871,47 @@ where
871871 }
872872}
873873
874+ #[ cfg( feature = "olap" ) ]
875+ #[ derive( Debug ) ]
876+ pub struct AnyPurposeOrLoginTokenAuth ;
877+
878+ #[ cfg( feature = "olap" ) ]
879+ #[ async_trait]
880+ impl < A > AuthenticateAndFetch < UserIdFromAuth , A > for AnyPurposeOrLoginTokenAuth
881+ where
882+ A : SessionStateInfo + Sync ,
883+ {
884+ async fn authenticate_and_fetch (
885+ & self ,
886+ request_headers : & HeaderMap ,
887+ state : & A ,
888+ ) -> RouterResult < ( UserIdFromAuth , AuthenticationType ) > {
889+ let payload =
890+ parse_jwt_payload :: < A , SinglePurposeOrLoginToken > ( request_headers, state) . await ?;
891+ if payload. check_in_blacklist ( state) . await ? {
892+ return Err ( errors:: ApiErrorResponse :: InvalidJwtToken . into ( ) ) ;
893+ }
894+
895+ let purpose_exists = payload. purpose . is_some ( ) ;
896+ let role_id_exists = payload. role_id . is_some ( ) ;
897+
898+ if purpose_exists ^ role_id_exists {
899+ Ok ( (
900+ UserIdFromAuth {
901+ user_id : payload. user_id . clone ( ) ,
902+ } ,
903+ AuthenticationType :: SinglePurposeOrLoginJwt {
904+ user_id : payload. user_id ,
905+ purpose : payload. purpose ,
906+ role_id : payload. role_id ,
907+ } ,
908+ ) )
909+ } else {
910+ Err ( errors:: ApiErrorResponse :: InvalidJwtToken . into ( ) )
911+ }
912+ }
913+ }
914+
874915#[ derive( Debug , Default ) ]
875916pub struct AdminApiAuth ;
876917
@@ -2504,17 +2545,27 @@ where
25042545 T : serde:: de:: DeserializeOwned ,
25052546 A : SessionStateInfo + Sync ,
25062547{
2507- let token = match get_cookie_from_header ( headers) . and_then ( cookies:: parse_cookie) {
2508- Ok ( cookies) => cookies,
2509- Err ( error) => {
2510- let token = get_jwt_from_authorization_header ( headers) ;
2511- if token. is_err ( ) {
2512- logger:: error!( ?error) ;
2513- }
2514- token?. to_owned ( )
2515- }
2548+ let cookie_token_result = get_cookie_from_header ( headers) . and_then ( cookies:: parse_cookie) ;
2549+ let auth_header_token_result = get_jwt_from_authorization_header ( headers) ;
2550+ let force_cookie = state. conf ( ) . user . force_cookies ;
2551+
2552+ logger:: info!(
2553+ user_agent = ?headers. get( headers:: USER_AGENT ) ,
2554+ header_names = ?headers. keys( ) . collect:: <Vec <_>>( ) ,
2555+ is_token_equal =
2556+ auth_header_token_result. as_deref( ) . ok( ) == cookie_token_result. as_deref( ) . ok( ) ,
2557+ cookie_error = ?cookie_token_result. as_ref( ) . err( ) ,
2558+ token_error = ?auth_header_token_result. as_ref( ) . err( ) ,
2559+ force_cookie,
2560+ ) ;
2561+
2562+ let final_token = if force_cookie {
2563+ cookie_token_result?
2564+ } else {
2565+ auth_header_token_result?. to_owned ( )
25162566 } ;
2517- decode_jwt ( & token, state) . await
2567+
2568+ decode_jwt ( & final_token, state) . await
25182569}
25192570
25202571#[ cfg( feature = "v1" ) ]
0 commit comments