GKE: google.api_core.exceptions.Forbidden: 403 Caller does not have required permission — Workload Identity: unable to generate access token
A pod tried to call Google APIs but its Kubernetes service account is not bound to a Google service account (or the binding lacks roles).
Unable to generate access token; IAM returned 403iam.serviceAccounts.getAccessToken permission denied Workload IdentityWorkload Identity 403 Caller does not have required permission403 Permission iam.serviceAccounts.getAccessToken denied on resource Meaning
Workload Identity needs: the cluster/node pool with Workload Identity enabled, a KSA annotated with the GSA email, and an IAM binding giving the KSA roles/iam.workloadIdentityUser on the GSA. Then the GSA must hold the API roles. Missing any step gives 403 or falls back to the node's default service account.
Common causes
- Workload Identity not enabled on the node pool
- KSA missing
iam.gke.io/gcp-service-accountannotation - No
workloadIdentityUserbinding - GSA lacks required roles on the target resource
- Wrong namespace/KSA name in the binding member
⚡ Quick fix
- Annotate the KSA and bind it:
gcloud iam service-accounts add-iam-policy-binding GSA --role roles/iam.workloadIdentityUser --member "serviceAccount:PROJECT.svc.id.goog[NAMESPACE/KSA]" - Enable Workload Identity on the cluster and node pool
- Grant the GSA the needed API roles
Detailed fix by platform
kubectl
kubectl annotate serviceaccount KSA -n NAMESPACE iam.gke.io/gcp-service-account=GSA@PROJECT.iam.gserviceaccount.com
How to diagnose
- Pool — Workload Identity on?
- Annotation — KSA annotated?
- Binding — workloadIdentityUser?
🔧 Still not fixed?
Many errors look alike. If the steps above didn’t solve it, one of these is probably what you’re facing:
Similar errors
- Cloud Run 403: Your client does not have permission to get URL Cloud Run: Error: Forbidden — Your client does not have permission to get URL / from this server
- Could not load the default credentials Google Cloud: Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started
- GKE Ingress: backends marked UNHEALTHY (502) GKE Ingress: Some backend services are in UNHEALTHY state / 502 Server Error from the load balancer
Most viewed in Google Cloud / Firebase
- Missing or insufficient permissions Firestore: FirebaseError: [code=permission-denied]: Missing or insufficient permissions
- Container failed to start Cloud Run: The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable
- Cloud Run 504: The request has been terminated because it has reached the maximum request timeout Cloud Run: 504 Gateway Timeout — The request has been terminated because it has reached the maximum request timeout
Other ways to find it
Where this error sits
Origin: Platform & cloud. Errors that are often confused with or caused by this one (click to open):
🧠 Still stuck? Analyze your error
Paste the full message, response headers or stack trace — we'll detect the platform and point to the most likely cause.
💬 What worked for others
No tips yet — did something else fix this for you?
Share what worked for you
Tips are checked by an editor before they appear. Links are removed.
Report a correction or suggest an improvement
Last updated 4 Nov 2026