Skip to content

test(oauth2): auto-sync oidc-jwt-1 provider JWKs on SA key rotation - #14914

Draft
macastelaz wants to merge 2 commits into
googleapis:mainfrom
macastelaz:fix-wif-mtls-test-key-rotation
Draft

macastelaz wants to merge 2 commits into
googleapis:mainfrom
macastelaz:fix-wif-mtls-test-key-rotation

Conversation

@macastelaz

@macastelaz macastelaz commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Automatically syncs the oidc-jwt-1 Workload Identity Pool Provider's static jwksJson in ITWorkloadIdentityFederationTest whenever the integration test service account (it-service-account@gcloud-devel.iam.gserviceaccount.com) rotates keys bi-monthly (java_it_service_account_rotation).

Background

  • The 4 mTLS + actor_token Workload Identity Federation tests added in feat(oauth2): support certificate-bound OAuth2 tokens and mTLS rotation for Workload Identity Federation #14781 sign mock OIDC JWTs with it-service-account@gcloud-devel.iam.gserviceaccount.com's private key (GOOGLE_APPLICATION_CREDENTIALS), verified against the oidc-jwt-1 OIDC provider in gcloud-devel.
  • When it-service-account rotates keys every two months, the new private_key_id (kid) is not in oidc-jwt-1's static jwksJson, causing STS token exchange to fail with 400 Bad Request: Invalid JWT signature.
  • Because ITWorkloadIdentityFederationTest runs authenticated as it-service-account@gcloud-devel.iam.gserviceaccount.com—which already holds roles/iam.workloadIdentityPoolAdmin on gcloud-devel—ensureOidcJwtProviderJwksSynced() checks once per test run whether oidc-jwt-1's jwksJson includes privateKeyId. On the first run after a key rotation, it fetches the service account's live public JWK set (https://www.googleapis.com/service_accounts/v1/jwk/<client_email>) and patches oidc-jwt-1.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the workload identity federation integration tests to use a static test private key instead of the service account's private key. It modifies the setup script to append this static key to the JWK set retrieved from Google. The review feedback suggests improving the inline Python script in the setup script by adding a timeout and using a context manager for the network request to prevent potential hangs in CI/CD pipelines.

Comment on lines +140 to +142
import json, sys, urllib.request
url = f"https://www.googleapis.com/service_accounts/v1/jwk/{sys.argv[1]}"
jwks = json.loads(urllib.request.urlopen(url).read().decode())

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using urllib.request.urlopen without a timeout can cause the script to hang indefinitely if there are network issues, which can block CI/CD pipelines. Additionally, it is recommended to use a context manager (with statement) to ensure the connection/socket is properly closed after reading.

Suggested change
import json, sys, urllib.request
url = f"https://www.googleapis.com/service_accounts/v1/jwk/{sys.argv[1]}"
jwks = json.loads(urllib.request.urlopen(url).read().decode())
import json, sys, urllib.request
url = f"https://www.googleapis.com/service_accounts/v1/jwk/{sys.argv[1]}"
with urllib.request.urlopen(url, timeout=10) as response:
jwks = json.loads(response.read().decode("utf-8"))

@macastelaz macastelaz changed the title test(oauth2): sign mTLS WIF OIDC test JWTs with static test key to prevent key-rotation breakage test(oauth2): auto-sync oidc-jwt-1 provider JWKs on SA key rotation Nov 3, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant