Scopes and claims

What you can ask for and what comes back.

Scopes

ScopeWhat it gives
openidrequired; without it this is OAuth, not sign-in
profilename and last profile update time
emailemail address and whether it is verified
phonephone number and whether it is verified
offline_accessa refresh token that outlives the user's session

Ask only for what you need. Every extra scope is another line on the consent screen and another reason to decline.

Note

A refresh token is issued without offline_access too — it simply lives as long as the user's auth.my session. Ask for offline_access only if you need access while they are away.

Note

offline_access needs the user's consent once: the first request that asks for it leads to the consent screen with its own line — you don't need prompt=consent for that. Once the person has agreed, later sign-ins by the same person into the same app get offline_access silently, with no screen and no prompt=consent, as long as the requested scopes stay the same. prompt=consent still works as before and forces the screen every time, even when consent was already given.

Claims

They arrive in the id_token and in the /me response.

ClaimFrom scopeWhat it is
subopenidpermanent identifier — store this one
nameprofiledisplay name
updated_atprofilewhen the profile last changed
emailemailemail address
email_verifiedemailalways true: unverified addresses do not exist here
phone_numberphonephone number
phone_number_verifiedphonewhether it is verified

Plus fields that do not depend on scope:

ClaimWhat it is
ississuer, exactly https://auth.my
audyour client_id
exp, iatexpiry and issue time
amrhow they signed in
auth_timewhen the person last actually authenticated
sidsession identifier

About email_verified

The value is always true, and that is not a placeholder: an address only enters an account after verification — either by emailed code, or from a social provider that stated the address is verified.

Microsoft never sends that statement, so on a first Entra sign-in we additionally ask for an emailed code.

What is missing

There are no groups, roles or custom user attributes in the token. Roles inside your application are your data model: tie them to sub and manage them on your side.

Did this page help?