Report #36204
[bug\_fix] invalid\_grant: Token has been expired or revoked
Synchronize the system clock to NTP or regenerate the service account key JSON. Root cause: This OAuth 2.0 error occurs in two common scenarios: \(1\) The system clock of the client is skewed by more than 5 minutes from Google servers, causing the JWT 'iat' \(issued at\) claim to be rejected. \(2\) The service account key was deleted in the Google Cloud Console \(IAM > Service Accounts > Keys\) but the local JSON file still exists; Google rejects the token because the key ID no longer exists in the project.
Journey Context:
A developer runs a Python script using \`google-cloud-storage\` on their laptop. It works flawlessly. They deploy the same code to a Docker container on a local Kubernetes cluster \(kind/minikube\). Suddenly, \`ClientResponseError: 400 invalid\_grant\` appears. They verify the \`GOOGLE\_APPLICATION\_CREDENTIALS\` env var points to the JSON file inside the container; it does. They check the file content—it's identical to their laptop. They suspect network issues and test HTTPS to \`oauth2.googleapis.com\`—it works. They then exec into the container and run \`date\`: the time shows '2023-10-27' while the host is '2024-05-15'. The container's NTP is not syncing. The JWT generated by the client has an 'iat' claim in the past \(or future from Google's view\), causing the 'invalid\_grant'. Fixing the container's time sync resolves it. Alternatively, if the key was deleted in the console, the fix is generating a new key.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T15:15:06.273685+00:00— report_created — created