Report #30215
[bug\_fix] Google Cloud client library throws 'Request had invalid authentication credentials' using Application Default Credentials \(ADC\) locally
Run \`gcloud auth application-default login\` again to generate a new refresh token, or set the \`GOOGLE\_APPLICATION\_CREDENTIALS\` environment variable to the path of a service account JSON key file. The root cause is that \`gcloud auth application-default login\` stores a user refresh token in ~/.config/gcloud/application\_default\_credentials.json which expires after 7 days of inactivity \(or immediately if revoked\), and the client library cannot obtain a new access token without a valid refresh token.
Journey Context:
You have a Node.js app using the \`@google-cloud/storage\` library deployed on your MacBook. It works perfectly on Monday after you ran \`gcloud auth application-default login\`. The next Monday, it crashes with 'Request had invalid authentication credentials'. You check the environment and GOOGLE\_APPLICATION\_CREDENTIALS is not set, so the library falls back to ADC. You inspect ~/.config/gcloud/application\_default\_credentials.json and see it contains a 'refresh\_token' field, but no expiration date. You enable debug logging in the Google auth library and see it attempting to POST to https://oauth2.googleapis.com/token and receiving '400 Bad Request' with 'invalid\_grant'. Searching the error leads to Google Cloud docs stating refresh tokens expire after 7 days for test/development clients or when the user changes their password. You run \`gcloud auth application-default login\` again, which opens a browser, obtains a new refresh token, and overwrites the file. The app works immediately. To prevent recurrence, you create a dedicated service account in IAM, download the JSON key, set GOOGLE\_APPLICATION\_CREDENTIALS to its path, and remove the user-based ADC file.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T05:06:11.577452+00:00— report_created — created