Quick answer: preserve the HTTP status, Graph error code and inner error, request ID, client-request ID, UTC time, method, and URL. Decode the access token locally and compare its audience and scp or roles claims with the exact method’s permissions table.

Capture the complete failed request

Record the HTTP method and full Graph path without secrets, the API version, request headers relevant to behavior, response body, and Microsoft request identifiers. A 403 from GET and one from PATCH against the same resource can require different permissions.

Do not log the bearer token. Decode it only in an approved local tool or trusted administrative workflow, and capture the non-secret claims needed for comparison.

Test the authorization chain in order

LayerEvidenceTypical correction
Audienceaud identifies Microsoft GraphAcquire the token for the correct resource
Permission typeDelegated scp or application rolesUse a flow supported by the endpoint and workload
Granted permissionClaim matches a permission supported for the exact methodGrant the narrowest documented permission and consent appropriately
Caller authoritySigned-in user or workload identity can perform the actionAssign the necessary workload or directory authority
License and serviceTenant and benefiting identity are entitled to the workloadCorrect licensing or target the supported service
Resource boundaryObject, site, mailbox, tenant, or selected-resource grant is in scopeFix the resource-specific assignment rather than broadening globally

Distinguish delegated and application access

With delegated access, Graph evaluates both the app permission and what the signed-in user is allowed to do. A delegated scope does not elevate the user beyond their workload or directory authority. With application access, the service principal acts without a signed-in user and the token must contain application roles supported by that endpoint.

When an endpoint supports only one permission type or requires an additional workload role, switching from delegated to application access is not a harmless workaround. Confirm the method documentation and security impact first.

Read the error shape

Retest without creating privilege drift

  1. Use the exact method’s Microsoft Learn permissions table.
  2. Select the least-privileged permission for the intended access type.
  3. Apply consent through the approved tenant process.
  4. Acquire a new token and verify the expected claim is present.
  5. Retest the same request against the same target.
  6. Remove experimental broad grants that were not required.

A successful call proves that authorization was sufficient for that request; it does not prove every granted permission was necessary. Record the final permission set and why each grant remains.

Authoritative sources