@@ -75,3 +75,52 @@ async fn test_signer_jwt_auth_success() -> Result<()> {
7575
7676 Ok ( ( ) )
7777}
78+
79+ #[ tokio:: test]
80+ async fn test_signer_jwt_auth_fail ( ) -> Result < ( ) > {
81+ setup_test_env ( ) ;
82+ let chain = Chain :: Hoodi ;
83+
84+ // Mock JWT secrets
85+ let module_id = ModuleId ( JWT_MODULE . to_string ( ) ) ;
86+ let mut jwts = HashMap :: new ( ) ;
87+ jwts. insert ( module_id. clone ( ) , JWT_SECRET . to_string ( ) ) ;
88+
89+ // Create a signer config
90+ let loader = SignerLoader :: ValidatorsDir {
91+ keys_path : "data/keystores/keys" . into ( ) ,
92+ secrets_path : "data/keystores/secrets" . into ( ) ,
93+ format : ValidatorKeysFormat :: Lighthouse ,
94+ } ;
95+ let config = get_signer_config ( loader) ;
96+ let host = config. host ;
97+ let port = config. port ;
98+ let start_config = get_start_signer_config ( config, chain, jwts) ;
99+
100+ // Run the Signer
101+ let server_handle = tokio:: spawn ( SigningService :: run ( start_config) ) ;
102+
103+ // Make sure the server is running
104+ tokio:: time:: sleep ( Duration :: from_millis ( 100 ) ) . await ;
105+ if server_handle. is_finished ( ) {
106+ return Err ( eyre:: eyre!(
107+ "Signer service failed to start: {}" ,
108+ server_handle. await . unwrap_err( )
109+ ) ) ;
110+ }
111+
112+ // Create a JWT header
113+ let jwt = create_jwt ( & module_id, "incorrect secret" ) ?;
114+
115+ // Run a pubkeys request
116+ let client = reqwest:: Client :: new ( ) ;
117+ let url = format ! ( "http://{}:{}{}" , host, port, GET_PUBKEYS_PATH ) ;
118+ let response = client. get ( & url) . bearer_auth ( jwt) . send ( ) . await ?;
119+ assert ! ( response. status( ) . is_client_error( ) , "Failed to authenticate with JWT" ) ;
120+ info ! (
121+ "Server returned expected error code {} for invalid JWT: {}" ,
122+ response. status( ) ,
123+ response. text( ) . await . unwrap_or_else( |_| "No response body" . to_string( ) )
124+ ) ;
125+ Ok ( ( ) )
126+ }
0 commit comments