diff --git a/oauth2_http/java/com/google/auth/oauth2/ServiceAccountCredentials.java b/oauth2_http/java/com/google/auth/oauth2/ServiceAccountCredentials.java index 56ffb02b9..0f4bfcb48 100644 --- a/oauth2_http/java/com/google/auth/oauth2/ServiceAccountCredentials.java +++ b/oauth2_http/java/com/google/auth/oauth2/ServiceAccountCredentials.java @@ -119,6 +119,8 @@ public class ServiceAccountCredentials extends GoogleCredentials private transient HttpTransportFactory transportFactory; + private transient JwtCredentials selfSignedJwtCredentialsWithScope = null; + /** * Internal constructor * @@ -732,6 +734,11 @@ public boolean getUseJwtAccessWithScope() { return useJwtAccessWithScope; } + @VisibleForTesting + JwtCredentials getSelfSignedJwtCredentialsWithScope() { + return selfSignedJwtCredentialsWithScope; + } + @Override public String getAccount() { return getClientEmail(); @@ -972,8 +979,11 @@ public Map> getRequestMetadata(URI uri) throws IOException // Otherwise, use self signed JWT with uri as the audience. JwtCredentials jwtCredentials; if (!createScopedRequired() && useJwtAccessWithScope) { - // Create JWT credentials with the scopes. - jwtCredentials = createSelfSignedJwtCredentials(null); + // Create selfSignedJwtCredentialsWithScope when needed and reuse it for better performance. + if (selfSignedJwtCredentialsWithScope == null) { + selfSignedJwtCredentialsWithScope = createSelfSignedJwtCredentials(null); + } + jwtCredentials = selfSignedJwtCredentialsWithScope; } else { // Create JWT credentials with the uri as audience. jwtCredentials = createSelfSignedJwtCredentials(uri); diff --git a/oauth2_http/javatests/com/google/auth/oauth2/ServiceAccountCredentialsTest.java b/oauth2_http/javatests/com/google/auth/oauth2/ServiceAccountCredentialsTest.java index f0c95ef6b..f44ec99d9 100644 --- a/oauth2_http/javatests/com/google/auth/oauth2/ServiceAccountCredentialsTest.java +++ b/oauth2_http/javatests/com/google/auth/oauth2/ServiceAccountCredentialsTest.java @@ -1465,6 +1465,7 @@ public void getRequestMetadata_selfSignedJWT_withScopes() throws IOException { .build(); Map> metadata = credentials.getRequestMetadata(CALL_URI); + assertNotNull(((ServiceAccountCredentials) credentials).getSelfSignedJwtCredentialsWithScope()); verifyJwtAccess(metadata, "dummy.scope"); } @@ -1518,6 +1519,7 @@ public void getRequestMetadata_selfSignedJWT_withAudience() throws IOException { .build(); Map> metadata = credentials.getRequestMetadata(CALL_URI); + assertNull(((ServiceAccountCredentials) credentials).getSelfSignedJwtCredentialsWithScope()); verifyJwtAccess(metadata, null); }