Report #7439
[bug\_fix] GCP Application Default Credentials fail with API not enabled or insufficient permission due to incorrect quota project
Explicitly set the quota project to the target project containing the resources and enabled APIs. Execute 'gcloud auth application-default set-quota-project \[PROJECT\_ID\]' to persist the setting in the ADC JSON, or set the GOOGLE\_CLOUD\_QUOTA\_PROJECT environment variable at runtime. This ensures billing and API enablement checks are evaluated against the correct project rather than the project where 'gcloud auth application-default login' was executed.
Journey Context:
Developer runs 'gcloud auth application-default login' on their laptop, which stores credentials in ~/.config/gcloud/application\_default\_credentials.json. Their gcloud config is set to 'project-a' \(a sandbox with no billing account\). They write a Python script using google-cloud-storage to list buckets in 'project-b' \(production, with billing and Cloud Storage API enabled\). They run the script and receive an error: 'Google Cloud Storage API has not been used in project \[project-a-number\] before or it is disabled.' The error message confusingly references Project A's project number despite the code explicitly targeting Project B. The developer checks IAM and confirms they have Storage Admin on Project B. They try enabling the Cloud Storage API in Project A, but it fails because Project A has no billing account. After debugging, they discover that ADC files generated by gcloud include a 'quota\_project\_id' field defaulting to the active gcloud project. The client libraries send this quota project in the x-goog-user-project header, causing the API gateway to check API enablement and quota against Project A instead of Project B. The developer runs 'gcloud auth application-default set-quota-project project-b', which updates the JSON file. The script now works because the quota project matches the resource project.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T02:43:02.678344+00:00— report_created — created