Microsoft Graph OAuthOutlook- en Microsoft 365-e-mailaccounts verifiëren
Een complete gids voor 2026 voor Microsoft Graph OAuth voor SaaS-ontwikkelaars. Behandelt Microsoft Entra-appregistratie, autoriteit-endpoints, mail-scopes, gedelegeerde versus applicatiemachtigingen, beheerdersgoedkeuring, autorisatiecode + PKCE, rotatie van vernieuwingstokens, AADSTS-foutcodes, en hoe Unipile 5 weken aan OAuth-installatie in 5 minuten elimineert.
importeer verzoekt
# Stap 1: Een gehoste authenticatielink genereren
response = requests.post(
"https://apiXXX.unipile.com:XXX
/api/v1/hosted/accounts/koppelen",
headers={"X-API-SLEUTEL": api_key},
json={
"type": "maken",
"providers": ["MICROSOFT"],
"api_url": jouw_dsn,
"verlooptOp": "2026-12-31T23:59:59Z"
}
)
# Stap 2: Leid je gebruiker om naar de URL
auth_url = response.json()["url"]
# Unipile verzorgt de volledige OAuth-procedure
# incl. Entra, scopes, tokens, vernieuwingWaarom Microsoft Graph OAuth in 2026 niet onderhandelbaar is
Als uw SaaS-applicatie e-mail van Outlook of Microsoft 365 leest, verzendt of synchroniseert, is Microsoft Graph OAuth niet langer optioneel. Drie belangrijke verouderingen hebben Basic Auth, verouderde protocollen en wachtwoorden voor apps overbodig gemaakt. OAuth 2.0 via de Microsoft Graph API is de enige ondersteunde methode.
De 3 OAuth-stromen die Microsoft ondersteunt (en welke SaaS nodig heeft)
Microsoft's identiteitsplatform ondersteunt verschillende OAuth 2.0-autorisatietypes. Het kiezen van de verkeerde is een veelvoorkomende oorzaak van verspilde ontwikkeltijd. Hier is de uitleg voor SaaS-toepassingen die namens hun gebruikers toegang krijgen tot e-mail.
Microsoft Entra App Registratie: 7 Stappen
Voordat uw app OAuth-tokens kan aanvragen, moet u een geregistreerde toepassing hebben in Microsoft Entra ID (voorheen Azure Active Directory). Hier zijn de exacte stappen, inclusief welke veldwaarden belangrijk zijn en welke cosmetisch zijn.
portal.azure.com, ga naar Microsoft Entra ID (zoek in de bovenste balk), dan Appregistraties, klik dan + Nieuwe registratie. Zie de Volledige Microsoft OAuth-documentatie voor extra context.Accounts in elke organisatiedirectory (elke Microsoft Entra ID-tenant - multitenant) en persoonlijke Microsoft-accounts. Dit komt overeen met de /gemeenschappelijk autoriteit eindpunt./organisaties autoriteit en verkleint uw contactvlak voor toestemming. Meer over autoriteit-eindpunten in sectie 4.Web voor server-side apps. Gebruik Applicatie met één pagina voor client-side flows (schakelt PKCE automatisch in).https://app.yourproduct.com/auth/microsoft/callback. Exacte overeenkomst vereist, elke afwijking veroorzaakt AADSTS50011.http://localhost:3000/callback) maar productie URI's moeten HTTPS gebruiken. Registreer beide afzonderlijk.Mail.lezen, offline_access, openid, profielMail.ReadWrite, Mail.verzenden, offline_access, openid, profielklant_id parameter in alle authenticatieverzoeken./gemeenschappelijk in plaats daarvan, maar behoud deze waarde voor beheerdersgoedkeurings-URL's.Het Kiezen van de Juiste Microsoft Authoriteit Endpoint
De autoriteits-URL die u gebruikt in uw OAuth-verzoeken bepaalt welke soorten Microsoft-accounts kunnen authenticeren en welke tokens u ontvangt. Als u dit verkeerd krijgt, treden er stille fouten op waarbij sommige gebruikers helemaal niet kunnen authenticeren.
| Autoriteits-URL | Accepteert | Gebruikscasus | Voorbehouden |
|---|---|---|---|
| /gemeenschappelijkMeeste SaaS | Zowel Microsoft Entra (werk/school) als persoonlijke Microsoft-accounts (Outlook.com, Hotmail, Live) | Multi-tenant SaaS dat alle Microsoft-gebruikers bedient. Eén eindpunt beheert uw gehele gebruikersbestand. | Tokens worden uitgegeven door de thuis tenant van elke gebruiker, niet door de jouwe. Tokenvalidatie moet tenant-specifieke uitgevers gebruiken of meerdere uitgevers accepteren. Kan Geen Voorwaardelijke Toegang-beleid afdwingen. |
| /organisaties | Alleen Microsoft Entra ID-accounts (werk/school). Geen persoonlijke Microsoft-accounts. | B2B SaaS gericht uitsluitend op zakelijke klanten, nooit consumenten Outlook.com-gebruikers. | Gebruikers met persoonlijke Microsoft-accounts zullen een foutmelding ontvangen. Eenvoudigere tokenvalidatie (single issuer patroon acceptabel). |
| consumenten | Alleen persoonlijke Microsoft-accounts (Outlook.com, Hotmail, Live). | Consumentenapps gericht op persoonlijke inboxen. Zeldzaam voor B2B SaaS. | Enterprise Microsoft 365-accounts worden afgewezen. Niet bruikbaar voor SaaS die zakelijke gebruikers bedient. |
| /{tenant-id} | Accounts in een specifieke Microsoft Entra-tenant alleen. | Single-tenant interne tools (een app van je eigen bedrijf). Admin consent-stromen gericht op een specifieke tenant. Wordt ook gebruikt in het admin consent redirect URL-patroon. | Elke andere gebruiker van de huurder wordt geweigerd. Alleen geschikt voor interne apps of wanneer bewust vergrendeld op de tenant van één klant. |
/gemeenschappelijk eindpunt, de is claim in the JWT zal zijn https://login.microsoftonline.com/{tenantId}/v2.0 waar {tenantId} varieert per gebruiker. Configureer uw JWT-validatiebibliotheek om elke issuer te accepteren die overeenkomt met https://login.microsoftonline.com/{tenantId}/v2.0 in plaats van een vaste afzenderreeks.Microsoft Graph Mail Scopes: Gedetailleerde Uitsplitsing
Microsoft Graph gebruikt toestemmingsbereiken (scopes) om te bepalen wat uw toepassing kan doen. Te veel bereiken aanvragen vergroot de wrijving op het toestemmingsscherm en vermindert de conversie. Te weinig aanvragen leidt tot runtimefouten. Hier zijn alle Mail-bereiken die u moet weten.
| Reikwijdte | Type | Wat het mogelijk maakt | Admin toestemming? |
|---|---|---|---|
| Mail.lezen | Gedelegeerd | Lees alle berichten in de mailbox van de geauthenticeerde gebruiker. Inclusief headers, body, bijlagen. Alleen-lezen - kan niet wijzigen of verzenden. | Gebruiker |
| Mail.LezenBasis | Gedelegeerd | Lees beperkte bericht-eigenschappen: onderwerp, afzender, ontvangers, datum. Kan bericht-inhoud of bijlagen niet lezen. Nuttig voor een lichtgewicht inbox-lijst zonder volledige inhouds-toegang. | Gebruiker |
| Mail.ReadWrite | Gedelegeerd | Alle berichten lezen en bewerken. Inclusief het aanmaken, bijwerken en verwijderen van berichten en mappen. Superset van Mail.Read - vraag niet beide aan. | Gebruiker |
| Mail.verzenden | Gedelegeerd | Verzend e-mails als de geauthenticeerde gebruiker. Vereist, zelfs als je ook Mail.ReadWrite hebt - verzenden is een aparte machtiging in Microsoft Graph. | Gebruiker |
| Mail.Read.Shared | Gedelegeerd | E-mail lezen in gedeelde postvakken of postvakken van andere gebruikers waartoe de geauthenticeerde gebruiker toegang heeft gekregen. Niet voor het lezen van het eigen postvak van de gebruiker. | Gebruiker |
| Mail.LeesSchrijf.Gedeeld | Gedelegeerd | E-mails lezen en wijzigen in gedeelde postvakken waartoe de gebruiker toegang heeft. | Gebruiker |
| E-mail.Verzenden.Gedeeld | Gedelegeerd | E-mail verzenden vanuit gedeelde postbussen of "verzenden namens" een andere gebruiker (als die gebruiker toegang heeft verleend). | Gebruiker |
| offline_access | Gedelegeerd | Instrueert Microsoft om een vernieuwingstoken uit te geven. Zonder dit ontvangt u alleen een kortstondig toegangstoken waarmee het niet kan worden vernieuwd. Altijd vereist voor SaaS-toepassingen. | Gebruiker |
| openid | Gedelegeerd | Geeft een ID-token terug met basale gebruikeridentificatie. Vereist als je wilt weten wie er is geauthenticeerd zonder een aparte /me API-aanroep te doen. | Gebruiker |
| profiel | Gedelegeerd | Voegt de claims name en preferred_username toe aan de ID-token. Meestal inbegrepen bij openid. | Gebruiker |
| E-mail.Lezen (App) | Toepassing | Lees alle e-mail in alle postvakken in de tenant zonder gebruikersinteractie. Gebruikt door daemon-services. Vereist tenantadministrator-toestemming. | Admin vereist |
| Mail.LezenSchrijven (App) | Toepassing | Lees en schrijf alle e-mails in alle postbussen van tenants. Zeer brede toestemming. Alleen voor vertrouwd intern gereedschap met expliciete goedkeuring van de tenant-administrator. | Admin vereist |
scope=Mail.Readoffline_accessopenidprofile
scope=Mail.ReadWriteMail.Sendoffline_accessopenidprofile
Gedelegeerde versus toepassingsmachtigingen: wanneer elke van toepassing is
Microsoft Graph gebruikt twee fundamenteel verschillende machtigingsmodellen. De meeste SaaS-ontwikkelaars kiezen standaard voor het verkeerde model, wat leidt tot onnodige vereisten voor beheerdersgoedkeuring en een slechte gebruikerservaring. Hier lees je precies wanneer je elk model moet gebruiken.
Auth Code + PKCE: Stap-voor-stap Curl Voorbeelden
Hier is de volledige Microsoft Graph OAuth 2.0-autorisatiecodestroom met PKCE, van het genereren van de codeverifieerder tot het uitwisselen van tokens. Dit zijn productierijpe voorbeelden die u direct kunt aanpassen aan uw stack.
importeer os, base64, hashlib
# 1. Genereer code_verifier (43-128 tekens, URL-veilige Base64)
code_verifier = base64.urlsafe_b64encode(
os.willekeurig(32)
).ontcijfer('utf-8').rstrip('=')
# 2. Genereer code_challenge = BASE64URL(SHA256(code_verifier))
code_uitdaging = base64.urlsafe_b64encode(
hashlib.sha256(gecodeerde_verificatie.coderen('utf-8')).verteren()
).ontcijfer('utf-8').rstrip('=')
# Sla code_verifier op in de sessie – je hebt deze nodig in stap 4
# Verzend code_challenge in de autorisatie-URLcode - vraagt om een autorisatiecodeoffline_access voor vernieuwingstokens.S256 - gebruik altijd SHA-256, nooit plat# Stel de autorisatie-URL samen (in een overzichtelijke indeling)
AUTH_URL="https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=JOUW_CLIENT_ID
&response_type=code
&redirect;_uri=https://3aapp.com/3aauth/3ams/3acb
&scope;=Mail.ReadWriteMail.Sendoffline_access
&staat=WIILLEKEURIGE_STAATSWAARDE
&code_challenge=JOUW_CODE_UITDAGING
&code_challenge_method=S256"
# De gebruiker doorverwijzen naar $AUTH_URL
# Microsoft verzorgt de aanmelding, MFA en het toestemmingsscherm
# Bij succes: redirect_uri?code=AUTH_CODE&state;=...code query parameter. Valideer de staat parameter komt overeen met wat je hebt gestuurd. De code verloopt over 10 minuten - wissel deze onmiddellijk in bij stap 4.#-uitwisselingsautorisatiecode voor tokens
curl -X POST "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=JOUW_CLIENT_ID" \
-d "client_secret=JOUW_CLIENT_GEHEIM" \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE_VAN_CALLBACK" \
-d "redirect_uri=https://app.com/auth/ms/cb" \
-d "code_verifier=JOUW_CODE_VERIFIER" \
-d "scope=Mail.ReadWrite Mail.Send offline_access"{
"token_type": "Houder",
"bereik": "Mail.LezenSchrijven Mail.Verzenden offline_toegang",
"verloopt_in": 3600,
"toegangstoken": "eyJ0eXAiOiJKV1Qi...",
"vernieuwings_token": "0.ARoAi7W...",
"id_token": "eyl0eXAi..."
}Vernieuwingstokenbeheer: rotatie, verlopen en voorwaardelijke toegang
Microsoft Graph-vernieuwings-tokens zijn langdurig, maar niet permanent. Verschillende omstandigheden kunnen ze stilzwijgend ongeldig maken. Het begrijpen van deze randgevallen is wat een hoogwaardige Microsoft OAuth-integratie onderscheidt van een die willekeurig faalt voor zakelijke gebruikers.
ongeldige_verlening verwerkt fouten gracieus en vraagt om herauthenticatie.ongeldige_verlening fout.ongeldige_verlening. Dit is verwacht gedrag - handel dit af door het gekoppelde account te markeren als opnieuw te autoriseren.# Vernieuw het toegangstoken met behulp van het opgeslagen vernieuwingstoken
curl -X POST "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=JOUW_CLIENT_ID" \
-d "client_secret=JOUW_CLIENT_GEHEIM" \
-d "grant_type=refresh_token" \
-d "verversings_token=OPGESLAGEN_VERVERSINGS_TOKEN" \
-d "scope=Mail.ReadWrite Mail.Send offline_access"
# Controleer ALTIJD of er een nieuw refresh_token in het antwoord staat.
# Indien aanwezig, vervang dan onmiddellijk het opgeslagen exemplaar.
# Als je de foutmelding `invalid_grant` krijgt, vraag de gebruiker dan om zich opnieuw te authenticeren.Veelvoorkomende AADSTS-fouten uitgelegd
Microsoft Graph OAuth-fouten volgen een consistent AADSTS-foutcodepatroon. Dit zijn de meest voorkomende fouten die u tijdens de ontwikkeling en productie zult tegenkomen, met exacte oorzaken en oplossingen.
| Foutcode | Wat het betekent | Oorzaak en oplossing |
|---|---|---|
| AADSTS65001 | Er is geen toestemming verleend voor een of meer van de aangevraagde bereiken | De gebruiker heeft geen toestemming gegeven voor de bereiken van uw app, of een tenantbeheerder heeft toestemming van gebruikers voor uw app geblokkeerd. Oplossing: Inclusief toestemming in uw autorisatie-URL om een nieuwe toestemmingsscherm af te dwingen, of de admin-toestemmings-URL naar de tenant-beheerder te sturen.Prompt=toestemming of vraag om beheerdersgoedkeuring |
| AADSTS50011 | Redirect URI-mismatch | De omleiding_uri uw aanvraag komt niet exact overeen met een geregistreerde redirect URI in uw Entra app-registratie. Zelfs een verschil in de schuine streep aan het einde kan dit veroorzaken. Oplossing: Kopieer de exacte URI uit uw Entra app-registratie en gebruik deze letterlijk.Oplossing: exacte URI-match in Entra app-registratie |
| AADSTS700016 | Applicatie niet gevonden in tenant | De klant_id bestaat niet in de tenant waartegen wordt geauthenticeerd. Komt vaak voor bij het gebruik van een tenant-specifieke autoriteit (/{tenant-id}) voor een multi-tenant app. Oplossing: Gebruik /gemeenschappelijk of /organisaties autorisatie voor multi-tenant apps.Corrigeer: schakel over naar de machtiging /common of /organizations |
| AADSTS90099 | Applicatie is niet geautoriseerd in deze tenant (toestemming_vereist) | De app bestaat, maar is niet geaccordeerd in het tenant van de gebruiker. Verschilt van AADSTS65001 doordat de volledige app is geblokkeerd, niet slechts specifieke bereiken. Oplossing: Stuur de beheerdersgoedkeurings-URL naar de IT-beheerder van de klant. Herstel: admin toestemmings-URL naar klanttenant-admin |
| AADSTS70011 | Verleende subsidie is ongeldig of verlopen | Het ververstoken (refresh token) of de autorisatiecode is verlopen of ingetrokken. Autorisatiecodes verlopen na 10 minuten. Ververstokens verlopen na 90 dagen inactiviteit of na intrekking door de beheerder. Oplossing: Vraag de gebruiker om opnieuw te authenticeren vanaf het begin van de OAuth-stroom. Herstel: volledige herauthenticatieprompt |
| AADSTS50076: Er is een sterke verificatie vereist om u te kunnen aanmelden. | MFA is vereist door het voorwaardelijke toegangsbeleid | De tenant van de gebruiker vereist multifactorauthenticatie voor uw app. Dit is een beslissing aan de klantzijde die wordt afgedwongen door de tenantbeheerder. Uw app kan dit niet omzeilen. De gebruiker moet MFA voltooien. Bij gebruik van de autorisatiecodestroom zal Microsoft de MFA-prompt automatisch in de browser weergeven. Problemen doen zich voor bij geautomatiseerde stromen (clientreferenties) die MFA niet kunnen voltooien. Verwacht: gebruiker moet MFA voltooien |
| AADSTS50020 | Gebruikersaccount van externe identiteitsprovider bestaat niet in tenant | De gebruiker probeert te authenticeren met een persoonlijk Microsoft-account in een tenant die alleen organisatorische accounts toestaat, of vice versa. Oplossing: Controleer het autoriteitseindpunt - indien gebruikt /organisaties, persoonlijke accounts kunnen niet authenticeren. Schakel over naar /gemeenschappelijk als je ze allebei nodig hebt.Corrigeer: schakel autoriteit naar /common |
| AADSTS53003 | Toegang geblokkeerd door voorwaardelijk toegangsbeleid | Het Conditional Access-beleid van de tenant heeft deze authenticatiepoging volledig geblokkeerd (bijv. geblokkeerd land, niet-beheerd apparaat, geblokkeerde app). Dit is een beslissing aan de kant van de klant. U kunt dit niet overschrijven. Toon de fout aan de gebruiker en adviseer hen contact op te nemen met hun IT-beheerder. Klantzijde: adviseer gebruiker contact op te nemen met IT-beheerder |
Sla 5 weken aan OAuth-installatiewerk over met Unipile
Alles in deze handleiding - Entra app-registratie, autoriteit-eindpunten, scope-selectie, PKCE, token-rotatie, AADSTS-foutafhandeling - is engineeringtijd die uw product niet verder brengt. Unipile beheert de volledige Microsoft Graph OAuth-stack als een beheerde service, zodat uw team één API-aanroep schrijft in plaats van 500 regels OAuth-functionaliteit.
importeer verzoekt
UNIPILE_API_URL = "https://apiXXX.unipile.com:XXX"
UNIPILE_API_SLEUTEL = "je-api-sleutel"
# Stap 1: Genereer een gehoste authenticatielink voor Microsoft
response = requests.post(
"{UNIPILE_API_URL}/api/v1/hosted/accounts/link",
headers={
"X-API-SLEUTEL": UNIPILE_API_KEY,
"Content-Type": "application/json"
},
json={
"type": "maken",
"providers": ["MICROSOFT"],
"api_url"UNIPILE_API_URL,
"verlooptOp": "2026-12-31T23:59:59Z",
# Optioneel: koppel deze link aan een specifieke gebruiker
"naam": "gebruikers_id_123",
# Optioneel: ontvang een melding wanneer het account is gekoppeld
"notificatie_url": "https://app.yourproduct.com/webhooks/account-linked"
}
)
# Stap 2: Leid je gebruiker door naar deze URL
gehoste_authenticatie_url = antwoord.json()["url"]
Voorbeeld van #: https://account.unipile.com/[encoded-token]
# Unipile-functies: Entra-omleiding, toestemmingsscherm, PKCE,
#-tokenuitwisseling, vernieuwing van de tokenopslag, bereikbeheer
# Stap 3: Gebruik na authenticatie de e-mail-API van Unipile om e-mails te lezen of te versturen
emails = requests.krijgen(
f"{UNIPILE_API_URL}/api/v1/emails",
headers={"X-API-SLEUTEL": UNIPILE_API_KEY},
params={"account_id": "gekoppeld-account-id"}
)Veelgestelde vragen
De meest gestelde vragen over Microsoft Graph OAuth voor e-mailintegratie, van scope selectie tot tokenlevenscyclus en enterprise consent flows.
/gemeenschappelijk het autorisatie-eindpunt, een enkele Microsoft Entra-appregistratie handelt authenticatie af voor zowel persoonlijke Outlook.com-accounts als werk-/schoolaccounts van Microsoft 365. De sleutel is het selecteren van "Accounts in elke organisatiedirectory en persoonlijke Microsoft-accounts" bij het registreren van uw app in de Azure-portal.ongeldige_verlening fout. Ga hiermee soepel om: markeer het gekoppelde account als het dat opnieuw moet worden geauthenticeerd en toon een duidelijke prompt voor opnieuw authenticeren in uw product. Dit is verwacht gedrag - een beslissing aan de kant van de klant waar u geen controle over heeft.Mail.lezen, Mail.ReadWriteen Mail.verzenden gebruikersgoedkeuringsbereiken - individuele gebruikers kunnen deze goedkeuren tijdens het OAuth-proces. Toestemming van de beheerder is alleen vereist voor toepassingsmachtigingen of bereiken met hoge bevoegdheden, zoals Gebruiker.Lees.Alles. Sommige enterprise tenants configureren beleidsregels die alle toestemming voor apps van derden blokkeren. Dat is een beslissing van de klant.ongeldige_verlening fouten en vernieuw de oude refresh tokens met de nieuwe die bij elke token respons wordt geretourneerd.toestemming naar uw autorisatie-URL om een nieuw toestemmingsscherm af te dwingen. AADSTS90099De gehele applicatie is niet geautoriseerd in die tenant; de tenantbeheerder moet uw app vooraf goedkeuren. Stuur de URL voor beheerdersgoedkeuring naar de IT-beheerder van de klant. Beide fouten komen vaak voor in zakelijke scenario's waarbij tenants gebruikerstoestemmingen beperken.Mail.ReadWrite en Mail.verzenden in dezelfde scope string. Merk op dat Mail.ReadWrite en Mail.verzenden zijn afzonderlijke scopes - lees-/schrijftoegang verleent niet automatisch verzendpermissie. Neem altijd op offline_access om ervoor te zorgen dat u een vernieuwingstoken ontvangt. Zie de e-mail API-pagina voor implementatiedetails.