3131
3232package com .google .auth .oauth2 ;
3333
34+ import static com .google .auth .TestUtils .getDefaultExpireTime ;
35+ import static com .google .auth .oauth2 .ImpersonatedCredentialsTest .DEFAULT_IMPERSONATION_URL ;
36+ import static com .google .auth .oauth2 .ImpersonatedCredentialsTest .IMMUTABLE_SCOPES_LIST ;
37+ import static com .google .auth .oauth2 .ImpersonatedCredentialsTest .IMPERSONATED_CLIENT_EMAIL ;
38+ import static com .google .auth .oauth2 .ImpersonatedCredentialsTest .TOKEN_WITH_EMAIL ;
39+ import static com .google .auth .oauth2 .ImpersonatedCredentialsTest .VALID_LIFETIME ;
3440import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .ACCESS_TOKEN ;
3541import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .CALL_URI ;
3642import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .CLIENT_EMAIL ;
3743import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .DEFAULT_ID_TOKEN ;
3844import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .SCOPES ;
3945import static com .google .auth .oauth2 .ServiceAccountCredentialsTest .createDefaultBuilder ;
46+ import static com .google .auth .oauth2 .UserCredentialsTest .CLIENT_ID ;
47+ import static com .google .auth .oauth2 .UserCredentialsTest .CLIENT_SECRET ;
48+ import static com .google .auth .oauth2 .UserCredentialsTest .REFRESH_TOKEN ;
49+ import static org .junit .Assert .assertArrayEquals ;
4050import static org .junit .Assert .assertEquals ;
51+ import static org .junit .Assert .assertTrue ;
4152
4253import com .google .api .client .http .HttpStatusCodes ;
54+ import com .google .api .client .json .webtoken .JsonWebToken .Payload ;
4355import com .google .auth .TestAppender ;
4456import com .google .auth .TestUtils ;
57+ import com .google .gson .Gson ;
58+ import com .google .gson .JsonObject ;
4559import java .io .IOException ;
60+ import java .util .Arrays ;
4661import java .util .List ;
4762import java .util .Map ;
4863import org .junit .Test ;
5166
5267public class LoggingTest {
5368
69+ private static final Gson gson = new Gson ();
70+
5471 private TestAppender setupTestLogger (Class <?> clazz ) {
5572 TestAppender testAppender = new TestAppender ();
5673 testAppender .start ();
@@ -60,7 +77,37 @@ private TestAppender setupTestLogger(Class<?> clazz) {
6077 }
6178
6279 @ Test
63- public void getRequestMetadata_hasAccessToken () throws IOException {
80+ public void userCredentials_getRequestMetadata_fromRefreshToken_hasAccessToken ()
81+ throws IOException {
82+ TestAppender testAppender = setupTestLogger (UserCredentials .class );
83+ MockTokenServerTransportFactory transportFactory = new MockTokenServerTransportFactory ();
84+ transportFactory .transport .addClient (CLIENT_ID , CLIENT_SECRET );
85+ transportFactory .transport .addRefreshToken (REFRESH_TOKEN , ACCESS_TOKEN );
86+ UserCredentials userCredentials =
87+ UserCredentials .newBuilder ()
88+ .setClientId (CLIENT_ID )
89+ .setClientSecret (CLIENT_SECRET )
90+ .setRefreshToken (REFRESH_TOKEN )
91+ .setHttpTransportFactory (transportFactory )
92+ .build ();
93+
94+ Map <String , List <String >> metadata = userCredentials .getRequestMetadata (CALL_URI );
95+
96+ TestUtils .assertContainsBearerToken (metadata , ACCESS_TOKEN );
97+
98+ assertEquals (3 , testAppender .events .size ());
99+ JsonObject jsonMessage =
100+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
101+
102+ assertEquals (
103+ "com.google.auth.oauth2.UserCredentials" , testAppender .events .get (0 ).getLoggerName ());
104+ assertEquals (
105+ "Sending auth request to refresh access token" , jsonMessage .get ("message" ).getAsString ());
106+ testAppender .stop ();
107+ }
108+
109+ @ Test
110+ public void serviceAccountCredentials_getRequestMetadata_hasAccessToken () throws IOException {
64111 TestAppender testAppender = setupTestLogger (ServiceAccountCredentials .class );
65112 GoogleCredentials credentials =
66113 ServiceAccountCredentialsTest .createDefaultBuilderWithToken (ACCESS_TOKEN )
@@ -70,14 +117,17 @@ public void getRequestMetadata_hasAccessToken() throws IOException {
70117 TestUtils .assertContainsBearerToken (metadata , ACCESS_TOKEN );
71118
72119 assertEquals (3 , testAppender .events .size ());
120+ JsonObject jsonMessage =
121+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
122+
73123 assertEquals (
74- "Sending auth request to refresh access token" ,
75- testAppender .events .get (0 ).getFormattedMessage ());
124+ "Sending auth request to refresh access token" , jsonMessage .get ("message" ).getAsString ());
76125 testAppender .stop ();
77126 }
78127
79128 @ Test
80- public void idTokenWithAudience_iamFlow_targetAudienceMatchesAudClaim () throws IOException {
129+ public void serviceAccountCredentials_idTokenWithAudience_iamFlow_targetAudienceMatchesAudClaim ()
130+ throws IOException {
81131 TestAppender testAppender = setupTestLogger (ServiceAccountCredentials .class );
82132 String nonGDU = "test.com" ;
83133 MockIAMCredentialsServiceTransportFactory transportFactory =
@@ -108,11 +158,139 @@ public void idTokenWithAudience_iamFlow_targetAudienceMatchesAudClaim() throws I
108158 tokenCredential .getIdToken ().getJsonWebSignature ().getPayload ().getAudience ());
109159
110160 assertEquals (2 , testAppender .events .size ());
161+
162+ JsonObject jsonMessage1 =
163+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
164+ JsonObject jsonMessage2 =
165+ gson .fromJson (testAppender .events .get (1 ).getFormattedMessage (), JsonObject .class );
111166 assertEquals (
112167 "Sending Auth request to get id token via Iam Endpoint" ,
113- testAppender .events .get (0 ).getFormattedMessage ());
114- assertEquals ("Auth response payload" , testAppender .events .get (1 ).getFormattedMessage ());
168+ jsonMessage1 .get ("message" ).getAsString ());
169+ assertEquals ("Auth response payload" , jsonMessage2 .get ("message" ).getAsString ());
170+
171+ testAppender .stop ();
172+ }
173+
174+ @ Test ()
175+ public void impersonatedCredentials_refreshAccessToken_success ()
176+ throws IOException , IllegalStateException {
177+ TestAppender testAppender = setupTestLogger (ImpersonatedCredentials .class );
178+ MockIAMCredentialsServiceTransportFactory mockTransportFactory =
179+ new MockIAMCredentialsServiceTransportFactory ();
180+ mockTransportFactory .getTransport ().setTargetPrincipal (IMPERSONATED_CLIENT_EMAIL );
181+ mockTransportFactory .getTransport ().setAccessToken (ACCESS_TOKEN );
182+ mockTransportFactory .getTransport ().setExpireTime (getDefaultExpireTime ());
183+ mockTransportFactory .getTransport ().addStatusCodeAndMessage (HttpStatusCodes .STATUS_CODE_OK , "" );
184+ ImpersonatedCredentials targetCredentials =
185+ ImpersonatedCredentials .create (
186+ ImpersonatedCredentialsTest .getSourceCredentials (),
187+ IMPERSONATED_CLIENT_EMAIL ,
188+ null ,
189+ IMMUTABLE_SCOPES_LIST ,
190+ VALID_LIFETIME ,
191+ mockTransportFactory );
115192
193+ assertEquals (ACCESS_TOKEN , targetCredentials .refreshAccessToken ().getTokenValue ());
194+ assertEquals (
195+ DEFAULT_IMPERSONATION_URL , mockTransportFactory .getTransport ().getRequest ().getUrl ());
196+
197+ // verify metrics header added and authorization header intact
198+ Map <String , List <String >> requestHeader =
199+ mockTransportFactory .getTransport ().getRequest ().getHeaders ();
200+ com .google .auth .oauth2 .TestUtils .validateMetricsHeader (requestHeader , "at" , "imp" );
201+ assertTrue (requestHeader .containsKey ("authorization" ));
202+
203+ assertEquals (3 , testAppender .events .size ());
204+ JsonObject jsonMessage =
205+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
206+
207+ assertEquals (
208+ "com.google.auth.oauth2.ImpersonatedCredentials" ,
209+ testAppender .events .get (0 ).getLoggerName ());
210+ assertEquals (
211+ "Sending auth request to refresh access token" , jsonMessage .get ("message" ).getAsString ());
212+ assertEquals (4 , testAppender .events .get (0 ).getMDCPropertyMap ().size ());
213+ testAppender .stop ();
214+ }
215+
216+ @ Test
217+ public void idTokenWithAudience_withEmail () throws IOException {
218+ TestAppender testAppender = setupTestLogger (IamUtils .class );
219+ MockIAMCredentialsServiceTransportFactory mockTransportFactory =
220+ new MockIAMCredentialsServiceTransportFactory ();
221+ mockTransportFactory .getTransport ().setTargetPrincipal (IMPERSONATED_CLIENT_EMAIL );
222+ mockTransportFactory .getTransport ().setAccessToken (ACCESS_TOKEN );
223+ mockTransportFactory .getTransport ().setExpireTime (getDefaultExpireTime ());
224+ mockTransportFactory .getTransport ().addStatusCodeAndMessage (HttpStatusCodes .STATUS_CODE_OK , "" );
225+
226+ ImpersonatedCredentials targetCredentials =
227+ ImpersonatedCredentials .create (
228+ ImpersonatedCredentialsTest .getSourceCredentials (),
229+ IMPERSONATED_CLIENT_EMAIL ,
230+ null ,
231+ IMMUTABLE_SCOPES_LIST ,
232+ VALID_LIFETIME ,
233+ mockTransportFactory );
234+
235+ mockTransportFactory .getTransport ().setIdToken (TOKEN_WITH_EMAIL );
236+
237+ String targetAudience = "https://foo.bar" ;
238+ IdTokenCredentials tokenCredential =
239+ IdTokenCredentials .newBuilder ()
240+ .setIdTokenProvider (targetCredentials )
241+ .setTargetAudience (targetAudience )
242+ .setOptions (Arrays .asList (IdTokenProvider .Option .INCLUDE_EMAIL ))
243+ .build ();
244+ tokenCredential .refresh ();
245+ assertEquals (TOKEN_WITH_EMAIL , tokenCredential .getAccessToken ().getTokenValue ());
246+ Payload p = tokenCredential .getIdToken ().getJsonWebSignature ().getPayload ();
247+ assertTrue (p .containsKey ("email" ));
248+
249+ assertEquals (3 , testAppender .events .size ());
250+ JsonObject jsonMessage =
251+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
252+
253+ assertEquals ("com.google.auth.oauth2.IamUtils" , testAppender .events .get (0 ).getLoggerName ());
254+ assertEquals ("Sending auth request to get id token" , jsonMessage .get ("message" ).getAsString ());
255+ assertEquals (4 , testAppender .events .get (0 ).getMDCPropertyMap ().size ());
256+ testAppender .stop ();
257+ }
258+
259+ @ Test
260+ public void sign_sameAs () throws IOException {
261+ TestAppender testAppender = setupTestLogger (IamUtils .class );
262+ MockIAMCredentialsServiceTransportFactory mockTransportFactory =
263+ new MockIAMCredentialsServiceTransportFactory ();
264+ mockTransportFactory .getTransport ().setTargetPrincipal (IMPERSONATED_CLIENT_EMAIL );
265+ mockTransportFactory .getTransport ().setAccessToken (ACCESS_TOKEN );
266+ mockTransportFactory .getTransport ().setExpireTime (getDefaultExpireTime ());
267+ mockTransportFactory .getTransport ().addStatusCodeAndMessage (HttpStatusCodes .STATUS_CODE_OK , "" );
268+ ImpersonatedCredentials targetCredentials =
269+ ImpersonatedCredentials .create (
270+ ImpersonatedCredentialsTest .getSourceCredentials (),
271+ IMPERSONATED_CLIENT_EMAIL ,
272+ null ,
273+ IMMUTABLE_SCOPES_LIST ,
274+ VALID_LIFETIME ,
275+ mockTransportFactory );
276+
277+ byte [] expectedSignature = {0xD , 0xE , 0xA , 0xD };
278+
279+ mockTransportFactory .getTransport ().setTargetPrincipal (IMPERSONATED_CLIENT_EMAIL );
280+ mockTransportFactory .getTransport ().setSignedBlob (expectedSignature );
281+
282+ assertArrayEquals (expectedSignature , targetCredentials .sign (expectedSignature ));
283+
284+ assertEquals (3 , testAppender .events .size ());
285+ JsonObject jsonMessage =
286+ gson .fromJson (testAppender .events .get (0 ).getFormattedMessage (), JsonObject .class );
287+
288+ assertEquals ("com.google.auth.oauth2.IamUtils" , testAppender .events .get (0 ).getLoggerName ());
289+ assertEquals (
290+ "Sending auth request to get signature to sign the blob" ,
291+ jsonMessage .get ("message" ).getAsString ());
292+ assertEquals (4 , testAppender .events .get (0 ).getMDCPropertyMap ().size ());
293+ assertEquals (1 , testAppender .events .get (2 ).getMDCPropertyMap ().size ());
116294 testAppender .stop ();
117295 }
118296}
0 commit comments