PERMISSION_DENIED
gRPCERRORNotableAuthenticationHIGH confidence

The caller does not have permission to execute the specified operation

What this means

Indicates the client is authenticated but does not have the necessary permissions for the requested resource or operation. This is distinct from UNAUTHENTICATED.

Why it happens
  1. 1The authenticated user's role (e.g., 'viewer') does not permit the action (e.g., 'delete').
  2. 2The resource has an access control list (ACL) that does not include the caller.
  3. 3The client's authentication token is missing required scopes for the operation.
How to reproduce

An authenticated user with a 'read-only' role attempts to call a method that modifies data.

trigger — this will error
trigger — this will error
// A 'viewer' client attempts to call a delete method
try {
  // Assume client is authenticated as a 'viewer'
  await adminClient.deleteUser({ userId: "user-to-delete" });
} catch (e) {
  // e.code will be grpc.status.PERMISSION_DENIED
}

expected output

StatusCode.PERMISSION_DENIED: The caller does not have permission to execute the specified operation

Fix 1

Check Authentication Scopes and Roles

WHEN When access is denied for an authenticated user.

Check Authentication Scopes and Roles
// Client: Ensure you are requesting the correct OAuth scopes
const token = getAuthToken({ scopes: ["read", "write"] });

// Server: Check user role before executing the operation
async deleteUser(call, callback) {
  if (call.metadata.get('user-role')[0] !== 'admin') {
    return callback({ code: grpc.status.PERMISSION_DENIED });
  }
}

Why this works

Verify that the user's credentials grant the specific permissions required for the target RPC method.

Fix 2

Review IAM/ACL Policies

WHEN When permissions are managed by an external system.

Review IAM/ACL Policies
// This is an administrative task, not a code change.
// Example: gcloud iam roles describe roles/my-custom-role
// Check if the role contains the permission 'my.service.deleteUser'

Why this works

Inspect the Identity and Access Management (IAM) policies or Access Control Lists (ACLs) to ensure the user/service account has the correct bindings.

What not to do

Retry the request without changing credentials

This is not a transient error. The user's identity lacks the required permission, and retrying will not change that.

Sources

Content generated with AI assistance and reviewed for accuracy. Found an error? hello@errcodes.dev

← All gRPC errors