Microsoft Graph OAuthAutenticare cassette postali di Outlook e Microsoft 365
Una guida completa al 2026 per Microsoft Graph OAuth per sviluppatori SaaS. Copre la registrazione delle app Microsoft Entra, gli endpoint di autorità, gli ambiti di Mail, i permessi delegati vs applicativi, il consenso dell'amministratore, il codice di autorizzazione + PKCE, la rotazione dei token di aggiornamento, i codici di errore AADSTS e come Unipile elimina 5 settimane di plumbing OAuth in 5 minuti.
import richieste
# Fase 1: Generare un link di autenticazione ospitato
response = requests.posta(
"https://apiXXX.unipile.com:XXX
/api/v1/hosted/accounts/collegare",
intestazioni={"X-API-KEY": api_key},
json={
"tipo": "creare",
"fornitori": ["MICROSOFT"],
"url_api": il_tuo_dsn,
"scadenza": "2026-12-31T23:59:59Z"
}
)
# Fase 2: Reindirizza l'utente all'URL
auth_url = risposta.json()["url"]
# Unipile gestisce l'intero flusso OAuth
#, inclusi Entra, scope, token e refreshPerché Microsoft Graph OAuth è Non-Negozabile nel 2026
Se la tua applicazione SaaS legge, invia o sincronizza e-mail di Outlook o Microsoft 365, Microsoft Graph OAuth non è più opzionale. Tre importanti depreciazioni hanno reso obsoleti i Basic Auth, i protocolli legacy e le password per app. OAuth 2.0 tramite l'API Microsoft Graph è l'unico percorso supportato.
I 3 Flussi OAuth Supportati da Microsoft (e Quale Serve alla SaaS)
La piattaforma di identità di Microsoft supporta diversi tipi di concessione OAuth 2.0. Scegliere quello sbagliato è una fonte comune di tempo di ingegneria sprecato. Ecco la suddivisione per applicazioni SaaS che accedono all'e-mail per conto dei propri utenti.
Registrazione di un'app in Microsoft Entra: 7 passaggi
Prima che la tua app possa richiedere token OAuth, è necessaria un'applicazione registrata in Microsoft Entra ID (precedentemente Azure Active Directory). Ecco i passaggi esatti, inclusi i valori dei campi che contano e quelli che sono estetici.
portal.azure.com, vai a Microsoft Entra ID (cerca nella barra in alto), poi Registrazioni app, quindi clicca + Nuova registrazione. Vedi il documentazione completa di Microsoft OAuth per ulteriore contesto.Account in qualsiasi directory organizzativa (qualsiasi tenant Microsoft Entra ID - multitenant) e account Microsoft personali. Ciò corrisponde al Comune endpoint di autorizzazione./organizzazioni autorità e riduce la tua superficie di consenso. Maggiori informazioni sugli endpoint di autorità nella sezione 4.Web per le app lato server. Usa Applicazione a pagina singola (SPA) per i flussi lato client (abilita automaticamente PKCE).https://app.yourproduct.com/auth/microsoft/callback. Corrispondenza esatta richiesta, qualsiasi deviazione causa AADSTS50011.http://localhost:3000/callbackma gli URI di produzione devono usare HTTPS. Registra entrambi separatamente.Posta.Leggi, accesso offline, openid, profiloMail.ReadWrite, Mail.Send, accesso offline, openid, profiloID cliente parametro in tutte le richieste di autenticazione.Comune invece, ma conserva questo valore per gli URL di consenso dell'amministratore.Scegliere l'endpoint di autorizzazione Microsoft corretto
L'URL dell'autorità che utilizzi nelle richieste OAuth determina quali tipi di account Microsoft possono autenticarsi e quali token ricevi. Sbagliare questo passaggio causa errori silenziosi per cui alcuni utenti non riescono ad autenticarsi affatto.
| URL dell'autorità | Accetta | Caso d'uso | Avvertenze |
|---|---|---|---|
| ComuneLa maggior parte dei SaaS | Sia account Microsoft Entra (lavoro/scuola) che account Microsoft personali (Outlook.com, Hotmail, Live) | SaaS multi-tenant al servizio di tutti gli utenti Microsoft. Un unico endpoint gestisce tutta la tua base di utenti. | I token sono emessi dall'organizzazione principale di ciascun utente, non dalla tua. La convalida dei token deve utilizzare l'emittente specifico dell'organizzazione o accettare più emittenti. Non è possibile applicare criteri di accesso condizionale. |
| /organizzazioni | Solo account Microsoft Entra ID (lavoro/scuola). Nessun account Microsoft personale. | SaaS B2B mirato esclusivamente a clienti enterprise, mai a utenti consumer di Outlook.com. | Gli utenti con account Microsoft personali riceveranno un errore. Validazione del token più semplice (pattern a emittente singolo accettabile). |
| consumatori | Solo account Microsoft personali (Outlook.com, Hotmail, Live). | App consumeristiche che prendono di mira le caselle di posta personali. Rara per il SaaS B2B. | Gli account Enterprise Microsoft 365 vengono rifiutati. Non utili per il servizio SaaS rivolto agli utenti aziendali. |
| /{id-tenant} | Account in un tenant Microsoft Entra specifico. | Strumenti interni a tenant singolo (app della tua azienda). Flussi di consenso dell'amministratore mirati a un tenant specifico. Utilizzato anche nel pattern URL di reindirizzamento del consenso dell'amministratore. | Gli utenti di ogni altro tenant vengono rifiutati. Adatto solo per app interne o quando si blocca deliberatamente a un tenant di un cliente. |
Comune endpoint, il sì il claim (issuer) nel JWT sarà https://login.microsoftonline.com/{tenantId}/v2.0 dove {tenantId} varia per utente. Configura la tua libreria di convalida JWT per accettare qualsiasi issuer che corrisponda https://login.microsoftonline.com/{tenantId}/v2.0 piuttosto che una stringa emittente fissa.Microsoft Graph Mail Scopes: Analisi dettagliata
Microsoft Graph utilizza gli ambiti di autorizzazione per controllare ciò che la tua applicazione può fare. Richiedere troppi ambiti aumenta l'attrito nella schermata di consenso e riduce le conversioni. Richiederne troppo pochi causa errori di runtime. Ecco tutti gli ambiti di posta elettronica che devi conoscere.
| Ambito | Tipo | Cosa consente | Consenso dell'amministratore? |
|---|---|---|---|
| Posta.Leggi | Delegato | Leggi tutti i messaggi nella casella di posta dell'utente autenticato. Include intestazioni, corpo, allegati. Sola lettura - non può modificare né inviare. | Utente |
| Posta.LeggiBase | Delegato | Leggi le proprietà limitate del messaggio: oggetto, mittente, destinatari, data. Non è possibile leggere il corpo del messaggio o gli allegati. Utile per elenchi di posta in arrivo leggeri senza accesso completo al contenuto. | Utente |
| Mail.ReadWrite | Delegato | Leggi e modifica tutti i messaggi. Include la creazione, l'aggiornamento, l'eliminazione di messaggi e cartelle. Superset di Mail.Read - non richiedere entrambi. | Utente |
| Mail.Send | Delegato | Invia e-mail come utente autenticato. Obbligatorio anche se si dispone di Mail.ReadWrite: l'invio è un'autorizzazione separata in Microsoft Graph. | Utente |
| Mail.Read.Shared | Delegato | Leggere le e-mail in caselle di posta condivise o in quelle di altri utenti a cui l'utente autenticato ha avuto accesso. Non per leggere la casella di posta dell'utente stesso. | Utente |
| Mail.ReadWrite.Shared | Delegato | Leggere e modificare le e-mail nelle cassette postali condivise a cui l'utente ha accesso. | Utente |
| Mail.Invia.Condivisa | Delegato | Inviare e-mail da cartelle condivise o "invia per conto" di un altro utente (se l'utente ha concesso l'accesso). | Utente |
| accesso offline | Delegato | Istruisce Microsoft a emettere un token di aggiornamento. Senza questo, si riceve solo un token di accesso di breve durata senza alcun modo per rinnovarlo. Sempre richiesto per le applicazioni SaaS. | Utente |
| openid | Delegato | Restituisce un ID token con l'identità base dell'utente. Richiesto se si desidera sapere chi si è autenticato senza effettuare una chiamata API /me separata. | Utente |
| profilo | Delegato | Aggiunge le dichiarazioni name e preferred_username all'ID token. Solitamente incluso con openid. | Utente |
| Mail.Leggi (App) | Applicazione | Leggi tutta la posta in tutte le cassette postali nel tenant senza interazione dell'utente. Utilizzato dai servizi daemon. Richiede il consenso dell'amministratore del tenant. | Amministratore richiesto |
| Posta.LetturaScrittura (App) | Applicazione | Leggere e scrivere tutte le email in tutte le caselle di posta dei tenant. Permesso molto ampio. Solo per strumenti interni fidati con l'approvazione esplicita dell'amministratore del tenant. | Amministratore richiesto |
scope=Mail.Readaccesso_offlineopenidprofilo
scope=Mail.ReadWriteMail.Sendoffline_accessopenidprofile
Permessi Delegati vs Permessi Applicazione: Quando Usare Ciascuno
Microsoft Graph utilizza due modelli di autorizzazione fondamentalmente diversi. La maggior parte degli sviluppatori SaaS sceglie di default quello sbagliato, il che porta a requisiti di consenso dell'amministratore non necessari e a un'esperienza utente compromessa. Ecco esattamente quando usare ciascuno.
Codice di autenticazione + PKCE: esempi Curl passo passo
Ecco il flusso completo di Microsoft Graph OAuth 2.0 con codice di autorizzazione e PKCE, dalla generazione del verificatore di codice allo scambio di token. Questi sono esempi di livello di produzione che puoi adattare direttamente al tuo stack.
import os, base64, hashlib
# 1. Genera code_verifier (43-128 caratteri, base64 compatibile con gli URL)
code_verifier = base64.urlsafe_b64encode(
os.urandom(32)
).decodifica('utf-8').rimuovere gli spazi bianchi alla fine('=')
# 2. Generare code_challenge = BASE64URL(SHA256(code_verifier))
sfida_di_codice = base64.urlsafe_b64encode(
hashlib.sha256(codice_verificatore.codificare('utf-8')).digest()
).decodifica('utf-8').rimuovere gli spazi bianchi alla fine('=')
# Salva code_verifier nella sessione: ti servirà al punto 4
# Inserire il codice di verifica nell'URL di autorizzazionecodice - richiede un codice di autorizzazioneaccesso offline per i token di aggiornamento.S256 - usa sempre SHA-256, mai normale# Generazione dell'URL di autorizzazione (formato ottimizzato per la leggibilità)
URL_AUTENTICAZIONE="https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=IL_TUO_CLIENT_ID
&response_type=code
&redirect;_uri=https://3Aapp.com/3Aauth/3Ams/3Acb
&scope;=Mail.ReadWriteMail.Sendoffline_access
&stato=VALORE_STATO_CASUALE
&code_challenge=LA_TUA_SFIDA_DI_CODICE
&code_challenge_method=S256"
# Reindirizza l'utente a $AUTH_URL
# Microsoft gestisce l'accesso, l'autenticazione a più fattori (MFA) e la schermata di consenso
# In caso di esito positivo: redirect_uri?code=AUTH_CODE&state;=...codice parametro di query. Validare il stato il parametro corrisponde a quello che hai inviato. Il codice scade tra 10 minuti - scambialo immediatamente al passo 4.Codice di autorizzazione # per i token
curl -X POSTA "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=IL_TUO_CLIENT_ID" \
-d "client_secret=IL_TUO_CLIENT_SECRET" \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE_FROM_CALLBACK" \
-d "redirect_uri=https://app.com/auth/ms/cb" \
-d "code_verifier=IL_TUO_CODE_VERIFIER" \
-d "scope=Mail.ReadWrite Mail.Send accesso_offline"{
"tipo_token": "Portatore",
"ambito": "Mail.ReadWrite Mail.Send offline_access",
"scadenza": 3600,
"token_di_accesso": "eyJ0eXAiOiJKV1Qi...",
"token di aggiornamento": "0.ARoAi7W...",
"token_id": "eyJ0eXAi..."
}Gestione del Refresh Token: Rotazione, Scadenza e Accesso Condizionale
I token di aggiornamento di Microsoft Graph sono di lunga durata ma non permanenti. Diverse condizioni possono invalidarli silenziosamente. Comprendere questi casi limite è ciò che distingue un'integrazione Microsoft OAuth di livello di produzione da una che si interrompe in modo casuale per gli utenti aziendali.
concessione_non_valida gestire gli errori con grazia e richiedere la riautenticazione.concessione_non_valida errore.concessione_non_valida. Questo è il comportamento atteso: gestiscilo contrassegnando l'account collegato come necessitante di riautorizzazione.# Aggiorna il token di accesso utilizzando il token di aggiornamento memorizzato
curl -X POSTA "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=IL_TUO_CLIENT_ID" \
-d "client_secret=IL_TUO_CLIENT_SECRET" \
-d "grant_type=refresh_token" \
-d "refresh_token=TOKEN_DI_REFRESH_MEMORIZZATO" \
-d "scope=Mail.ReadWrite Mail.Send accesso_offline"
# Verificare SEMPRE la presenza di un nuovo refresh_token nella risposta.
# Se presente, sostituire immediatamente quello immagazzinato.
# Se viene restituito un errore "invalid_grant", richiedere all'utente di effettuare nuovamente l'autenticazione.Errori comuni di AADSTS decodificati
Gli errori di Microsoft Graph OAuth seguono uno schema coerente di codici di errore AADSTS. Questi sono quelli più comuni che incontrerai durante lo sviluppo e la produzione, con cause profonde e correzioni esatte.
| Codice di errore | Cosa significa | Causa principale e correzione |
|---|---|---|
| AADSTS65001 | Il consenso non è stato concesso per uno o più degli ambiti richiesti | L'utente non ha concesso il consenso agli ambiti della tua app, oppure un amministratore del tenant ha bloccato il consenso dell'utente per la tua app. Soluzione: Includi consenso nell'URL di autorizzazione per forzare una schermata di consenso, o inviare l'URL di consenso dell'amministratore all'amministratore del tenant.Aggiungi prompt=consenso o richiedi il consenso dell'amministratore |
| AADSTS50011 | Errore di reindirizzamento URI | Il uri_di_reindirizzamento la tua richiesta non corrisponde esattamente a nessun URI di reindirizzamento registrato nella tua registrazione dell'app Entra. Anche una differenza nella barra finale causa questo problema. Correzione: Copia l'URI esatto dalla tua registrazione dell'app Entra e utilizzalo esattamente come appare.Correggi: corrispondenza esatta dell'URI nella registrazione dell'app Entra |
| AADSTS700016 | Applicazione non trovata nell'utenza | Il ID cliente non esiste nel tenant contro cui ci si sta autenticando. Comune quando si utilizza un'autorità specifica per il tenant (/{id-tenant}) per un'app multi-tenant. Correzione: Usa Comune o /organizzazioni autorità per app multi-tenant.Correggi: passa all'autorità /common o /organizations |
| AADSTS90099 | L'applicazione non è stata autorizzata in questo tenant (consent_required) | L'app esiste ma non è stata acconsentita nel tenant dell'utente. Differisce da AADSTS65001 in quanto l'intera app è bloccata, non solo gli ambiti specifici.
Soluzione: inviare l'URL di consenso dell'amministratore all'amministratore IT del cliente. Correggi: URL di consenso dell'amministratore al tenant amministratore del cliente |
| AADSTS70011 | Concessione non valida o scaduta | Il token di aggiornamento o il codice di autorizzazione sono scaduti o sono stati revocati. I codici di autorizzazione scadono dopo 10 minuti. I token di aggiornamento scadono dopo 90 giorni di inattività o revoca da parte dell'amministratore. Soluzione: Richiedere all'utente di autenticarsi nuovamente dall'inizio del flusso OAuth. Correggi: prompt autenticazione completa |
| AADSTS50076 | L'MFA è richiesto dalla policy di accesso condizionale | L'inquilino dell'utente richiede l'autenticazione a più fattori per la tua app. Questa è una decisione lato cliente imposta dall'amministratore dell'inquilino. La tua app non può aggirarla. L'utente deve completare l'MFA. Se si utilizza il flusso del codice di autenticazione, Microsoft visualizzerà automaticamente il prompt MFA nel browser. Sorgono problemi nei flussi automatizzati (credenziali client) che non possono completare l'MFA. Previsto: l'utente deve completare l'MFA |
| AADSTS50020 | L'account utente dal provider di identità esterno non esiste nel tenant | L'utente sta tentando di autenticarsi con un account Microsoft personale in un tenant che consente solo account aziendali, o viceversa. Correzione: Controlla il tuo endpoint di autorizzazione - se stai usando /organizzazioni, gli account personali non possono autenticarsi. Passa a Comune se hai bisogno di entrambi.Correggi: passa l'autorità a /common |
| AADSTS53003 | Accesso bloccato da una policy di accesso condizionale | La policy di Accesso Condizionale del tenant ha completamente bloccato questo tentativo di autenticazione (ad esempio, paese bloccato, dispositivo non gestito, app bloccata). Questa è una decisione lato cliente. Non puoi sovrascriverla. Comunica l'errore all'utente e consiglialo di contattare il proprio amministratore IT. Lato cliente: consigliare all'utente di contattare l'amministratore IT |
Saltate 5 settimane di "idraulica" OAuth con Unipile
Tutto in questa guida - registrazione dell'app Entra, endpoint di autorizzazione, selezione degli ambiti, PKCE, rotazione dei token, gestione degli errori AADSTS - è tempo di ingegneria che non fa avanzare il tuo prodotto. Unipile gestisce l'intero stack OAuth di Microsoft Graph come servizio gestito, in modo che il tuo team scriva una chiamata API invece di 500 righe di codice per l'autenticazione OAuth.
import richieste
UNIPILE_API_URL = "https://apiXXX.unipile.com:XXX"
CHIAVE_API_UNIPILE = "la tua-api-chiave"
# Fase 1: Generare un link di autenticazione ospitato per Microsoft
response = requests.posta(
f"{UNIPILE_API_URL}/api/v1/hosted/accounts/link",
intestazioni={
"X-API-KEY": UNIPILE_API_KEY,
"Content-Type": "application/json"
},
json={
"tipo": "creare",
"fornitori": ["MICROSOFT"],
"url_api": UNIPILE_API_URL,
"scadenza": "2026-12-31T23:59:59Z",
# (Opzionale): associa questo link a un utente specifico
"nome": "id_utente_123",
# (opzionale): ricevi una notifica quando l'account viene collegato
"notify_url": "https://app.yourproduct.com/webhooks/account-linked"
}
)
# Fase 2: reindirizza l'utente a questo URL
url_autenticazione_ospitata = risposta.json()["url"]
Esempio #: https://account.unipile.com/[encoded-token]
# Unipile gestisce: reindirizzamento Entra, schermata di consenso, PKCE,
Scambio di token #, aggiornamento dell'archivio dei token, gestione dell'ambito
# Fase 3: dopo l'autenticazione, utilizzare l'API e-mail di Unipile per leggere/inviare
email = richieste.ottenere(
f"{UNIPILE_API_URL}/api/v1/emails",
intestazioni={"X-API-KEY"{UNIPILE_API_KEY},
parametri={"account_id": "id-account-collegato"}
)Domande frequenti
Le domande più comuni su Microsoft Graph OAuth per l'integrazione email, dalla selezione degli ambiti al ciclo di vita dei token fino ai flussi di consenso enterprise.
Comune endpoint di autorizzazione, una singola registrazione dell'app Microsoft Entra gestisce l'autenticazione sia per gli account Outlook.com personali che per gli account di lavoro/scuola Microsoft 365. La chiave è selezionare "Account in qualsiasi directory organizzativa e account Microsoft personali" durante la registrazione della tua app nel portale di Azure.concessione_non_valida errore. Gestisci questo in modo appropriato: contrassegna l'account collegato come non autenticato e visualizza un chiaro prompt per la riautenticazione nel tuo prodotto. Questo è il comportamento previsto: una decisione lato cliente al di fuori del tuo controllo.Posta.Leggi, Mail.ReadWrite, e Mail.Send sono ambiti di consenso dell'utente: i singoli utenti possono approvarli durante il flusso OAuth. Il consenso dell'amministratore è richiesto solo per le autorizzazioni dell'applicazione o per gli ambiti con privilegi elevati come Utente.Leggi.Tutto. Alcuni tenant aziendali configurano criteri che bloccano il consenso a tutte le app di terze parti, e questa è una decisione lato cliente.concessione_non_valida errori e sostituire i vecchi token di refresh con quello nuovo restituito in ciascuna risposta del token.consenso al tuo URL di autorizzazione per forzare una schermata di consenso aggiornata. AADSTS90099L'intera applicazione non è stata autorizzata in tale tenant: l'amministratore del tenant deve pre-approvare la tua app. Invia l'URL di consenso dell'amministratore all'amministratore IT del cliente. Entrambi gli errori sono comuni in scenari aziendali in cui i tenant limitano il consenso degli utenti.Mail.ReadWrite e Mail.Send nello stesso ambito della stringa. Notare che Mail.ReadWrite e Mail.Send sono ambiti separati: avere accesso in lettura/scrittura non concede automaticamente l'autorizzazione all'invio. Includere sempre accesso offline per assicurarti di ricevere un token di aggiornamento. Vedi il pagina API email per i dettagli di implementazione.