Microsoft Graph OAuthAutenticar caixas de correio do Outlook e do Microsoft 365
Guia completo de 2026 para OAuth do Microsoft Graph para desenvolvedores de SaaS. Abrange registro de aplicativo do Microsoft Entra, endpoints de autoridade, escopos de email, permissões delegadas vs. de aplicativo, consentimento do administrador, código de autorização + PKCE, rotação de token de atualização, códigos de erro AADSTS e como o Unipile elimina 5 semanas de encadeamento de OAuth em 5 minutos.
import solicitações
# Etapa 1: Gerar um link de autenticação hospedado
response = requests.postagem(
"https://apiXXX.unipile.com:XXX
`/api/v1/hosted/accounts/link"`",
cabeçalhos={"X-API-KEY": chave_api},
json={
"tipo": "criar",
"fornecedores": ["MICROSOFT"],
"url_da_api": seu_dsn,
"expiraEm": "31/12/2026 23:59:59"
}
)
# Etapa 2: Redirecione o usuário para a URL
auth_url = resposta.json()["url"]
O # Unipile gerencia todo o fluxo OAuth
#, incluindo Entra, escopos, tokens e atualizaçãoPor que o OAuth do Microsoft Graph é Inegociável em 2026
Se o seu aplicativo SaaS lê, envia ou sincroniza emails do Outlook ou Microsoft 365, o Microsoft Graph OAuth não é mais opcional. Três descontinuações importantes tornaram a autenticação básica, protocolos legados e senhas de aplicativos obsoletos. O OAuth 2.0 via API do Microsoft Graph é o único caminho suportado.
Os 3 Fluxos OAuth Suportados pela Microsoft (e Qual o SaaS Precisa)
A plataforma de identidade da Microsoft suporta vários tipos de concessão OAuth 2.0. Escolher o errado é uma causa comum de tempo de engenharia desperdiçado. Aqui está o detalhamento para aplicativos SaaS que acessam e-mail em nome de seus usuários.
Registro de Aplicativo no Microsoft Entra: 7 Passos
Antes que seu aplicativo possa solicitar tokens OAuth, você precisa de um aplicativo registrado no Microsoft Entra ID (anteriormente Azure Active Directory). Aqui estão os passos exatos, incluindo quais valores de campo são importantes e quais são cosméticos.
portal.azure.com, vá para Microsoft Entra ID (pesquisar na barra superior), depois Registros de aplicativos, então clique em + Novo cadastro. Veja a documentação completa do Microsoft OAuth para contexto adicional.Contas em qualquer diretório organizacional (qualquer locatário do Microsoft Entra ID - multilocatário) e contas pessoais da Microsoft. Isto corresponde ao /comum endpoint de autoridade./organizações autoridade e reduz sua área de superfície de consentimento. Mais sobre pontos de extremidade de autoridade na seção 4.Web para aplicativos do lado do servidor. Use Aplicação de Página Única (SPA) para fluxos do lado do cliente (habilita automaticamente PKCE).https://app.yourproduct.com/auth/microsoft/callback. Correspondência exata necessária, qualquer desvio causa AADSTS50011.http://localhost:3000/callback) mas URIs de produção devem usar HTTPS. Registre ambos separadamente.Mail.Read, acesso_offline, openid, perfilMail.ReadWrite, Mail.Send, acesso_offline, openid, perfilid_cliente parâmetro em todas as requisições de autenticação./comum em vez disso, mas mantenha este valor para as URLs de consentimento do administrador.Escolhendo o Ponto de Extremidade Correto da Autoridade da Microsoft
A URL de autoridade que você usa nas suas requisições OAuth determina quais tipos de contas da Microsoft podem se autenticar e quais tokens você recebe. Errar isso causa falhas silenciosas onde alguns usuários não conseguem se autenticar.
| URL de Autoridade | Aceita | Caso de uso | Ressalvas |
|---|---|---|---|
| /comumA MAIORIA DE SAAS | Tanto as contas Microsoft Entra (trabalho/escola) quanto contas Microsoft pessoais (Outlook.com, Hotmail, Live) | SaaS multilocatário atendendo a todos os usuários da Microsoft. Um único endpoint gerencia toda a sua base de usuários. | Os tokens são emitidos pelo tenant de origem de cada usuário, não pelo seu. A validação do token deve usar o emissor específico do tenant ou aceitar múltiplos emissores. Não é possível impor políticas de Acesso Condicional. |
| /organizações | Contas do Microsoft Entra ID somente (trabalho/escola). Não são aceitas contas pessoais da Microsoft. | SaaS B2B voltado apenas para clientes corporativos, nunca para usuários consumidores do Outlook.com. | Usuários com contas pessoais da Microsoft receberão um erro. Validação de token mais simples (padrão de emissor único aceitável). |
| /consumidores | Apenas contas Microsoft pessoais (Outlook.com, Hotmail, Live). | Aplicativos para consumidores focados em caixas de entrada pessoais. Raro para SaaS B2B. | Contas do Microsoft 365 corporativas são rejeitadas. Não é útil para SaaS que atende usuários empresariais. |
| /{tenant-id} | Contas em um locatário específico do Microsoft Entra apenas. | Ferramentas internas de locatário único (aplicativo da sua própria empresa). Fluxos de consentimento do administrador direcionados a um locatário específico. Também usado no padrão de URL de redirecionamento de consentimento do administrador. | Todos os usuários de outros inquilinos são rejeitados. Adequado apenas para aplicativos internos ou quando deliberadamente restrito a um inquilino de cliente. |
/comum endpoint, o se (issuer) o claim no JWT será https://login.microsoftonline.com/{tenantId}/v2.0 onde {tenantId} varia por usuário. Configure sua biblioteca de validação JWT para aceitar qualquer emissor correspondente https://login.microsoftonline.com/{tenantId}/v2.0 em vez de uma string de emissor fixa.Microsoft Graph Escopos de E-mail: Detalhamento Granular
O Microsoft Graph usa escopos de permissão para controlar o que seu aplicativo pode fazer. Solicitar muitos escopos aumenta o atrito na tela de consentimento e reduz a conversão. Solicitar poucos causa erros de tempo de execução. Aqui estão todos os escopos de Mail que você precisa saber.
| Escopo | Tipo | O que ele permite | Consentimento do administrador? |
|---|---|---|---|
| Mail.Read | Delegado | Ler todas as mensagens na caixa de correio do usuário autenticado. Inclui cabeçalhos, corpo, anexos. Somente leitura - não pode modificar ou enviar. | Usuário |
| Mail.ReadBasic | Delegado | Ler propriedades limitadas da mensagem: assunto, remetente, destinatários, data. Não é possível ler o corpo da mensagem ou anexos. Útil para listagem leve de caixa de entrada sem acesso ao conteúdo completo. | Usuário |
| Mail.ReadWrite | Delegado | Ler e modificar todas as mensagens. Inclui criar, atualizar, excluir mensagens e pastas. Superconjunto de Mail.Read - não solicite ambos. | Usuário |
| Mail.Send | Delegado | Envie e-mails como o usuário autenticado. Necessário, mesmo que você também tenha Mail.ReadWrite - o envio é uma permissão separada no Microsoft Graph. | Usuário |
| Mail.Read.Shared | Delegado | Ler e-mails em caixas de correio compartilhadas ou de outros usuários às quais o usuário autenticado recebeu acesso. Não para ler a caixa de correio do próprio usuário. | Usuário |
| Mail.ReadWrite.Shared | Delegado | Ler e modificar e-mails em caixas de correio compartilhadas às quais o usuário tem acesso. | Usuário |
| Mail.Send.Shared | Delegado | Enviar e-mail de caixas de correio compartilhadas ou "enviar em nome de" outro usuário (se esse usuário tiver concedido acesso). | Usuário |
| acesso_offline | Delegado | Instrui a Microsoft a emitir um token de atualização. Sem isso, você recebe apenas um token de acesso de curta duração sem forma de renová-lo. Sempre obrigatório para aplicações SaaS. | Usuário |
| openid | Delegado | Retorna um token de ID com a identidade básica do usuário. Necessário se você quiser saber quem se autenticou sem fazer uma chamada separada à API /me. | Usuário |
| perfil | Delegado | Adiciona os campos "name" e "preferred_username" ao ID token. Geralmente incluído com "openid". | Usuário |
| Mail.Read (App) | Aplicativo | Ler todos os e-mails em todas as caixas de correio no locatário sem interação do usuário. Usado por serviços de daemon. Requer consentimento do administrador do locatário. | Administrador necessário |
| Mail.ReadWrite (Aplicativo) | Aplicativo | Ler e escrever em todas as caixas de correio de todos os inquilinos. Permissão muito ampla. Apenas para ferramentas internas confiáveis com aprovação explícita do administrador do inquilino. | Administrador necessário |
scope=Mail.Readacesso_offlineopenidperfil
scope=Mail.ReadWriteMail.Sendoffline_accessopenidprofile
Permissões Delegadas vs. Permissões de Aplicativo: Quando Cada Uma se Aplica
O Microsoft Graph usa dois modelos de permissão fundamentalmente diferentes. A maioria dos desenvolvedores de SaaS acaba optando pelo modelo errado, o que leva a requisitos desnecessários de consentimento do administrador e a uma experiência de usuário prejudicada. Veja exatamente quando usar cada um.
Código de Autorização + PKCE: Exemplos Passo a Passo com Curl
Aqui está o fluxo completo de código de autorização OAuth 2.0 do Microsoft Graph com PKCE, desde a geração do code verifier até a troca de tokens. Estes são exemplos de nível de produção que você pode adaptar diretamente à sua stack.
import os, base64, hashlib
# 1. Gerar code_verifier (43-128 caracteres, base64 compatível com URL)
verifier_de_codigo = base64.urlsafe_b64encode(
os.urandom(32)
).decodificar('utf-8').rstrip('=')
# 2. Gerar code_challenge = BASE64URL(SHA256(code_verifier))
desafio_de_codigo = base64.urlsafe_b64encode(
hashlib.sha256verificador_de_código.codificar('utf-8')).digest()
).decodificar('utf-8').rstrip('=')
# Armazene o code_verifier na sessão — você precisará dele na etapa 4
# Enviar o código_desafio na URL de autorizaçãocódigo solicita um código de autorizaçãoacesso_offline para tokens de atualização.S256 - sempre use SHA-256, nunca plano# Construir a URL de autorização (formato para facilitar a leitura)
URL_DE_AUTENTICACAO="https://login.microsoftonline.com/common/oauth2/v2.0/authorize
?client_id=SEU_CLIENT_ID
&response_type=code
&redirect;_uri=https://app.com/auth/ms/cb
&scope;=Mail.ReadWriteMail.Sendoffline_access
&estado=VALOR_ALEATÓRIO_DO_ESTADO
&desafio_de_codigo=SEU_DESAFIO_DE_CODIGO
&code_challenge_method=S256"
# Redirecionar o usuário para $AUTH_URL
# A Microsoft lida com o login, a autenticação multifatorial (MFA) e a tela de consentimento
# Em caso de sucesso: redirect_uri?code=AUTH_CODE&state;=...código parâmetro de consulta. Valide o estado o parâmetro corresponde ao que você enviou. O código expira em 10 minutos - troque-o imediatamente na etapa 4.Código de autorização da # Exchange para tokens
curl -X POST "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=SEU_CLIENT_ID" \
-d "client_secret=SEU_CLIENT_SECRET" \
-d "grant_type=authorization_code" \
-d "código=AUTH_CODE_FROM_CALLBACK" \
-d "redirect_uri=https://app.com/auth/ms/cb" \
-d "code_verifier=SEU_CODE_VERIFIER" \
-d "scope=Mail.ReadWrite Mail.Send offline_access"{
"tipo_token": "Portador",
"escopo": "Mail.ReadWrite Mail.Send offline_access",
"expira_em": 3600,
"token_de_acesso": "eyJ0eXAiOiJKV1Qi...",
"token_de_atualização": "0.ARoAi7W...",
"id_token": "eyJ0eXAi..."
}Tratamento de Token de Atualização: Rotação, Expiração e Acesso Condicional
Os tokens de atualização do Microsoft Graph são de longa duração, mas não permanentes. Várias condições podem invalidá-los silenciosamente. Entender esses casos extremos é o que separa uma integração Microsoft OAuth de nível de produção daquelas que falham aleatoriamente para usuários corporativos.
concessão_inválida Tratar erros graciosamente e solicitar reautenticação.concessão_inválida erro.concessão_inválida. Este é o comportamento esperado - lide com isso marcando a conta vinculada como precisando de reautorização.# Atualizar o token de acesso usando o token de atualização armazenado
curl -X POST "https://login.microsoftonline.com/common/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=SEU_CLIENT_ID" \
-d "client_secret=SEU_CLIENT_SECRET" \
-d "grant_type=refresh_token" \
-d "refresh_token=TOKEN_DE_ATUALIZAÇÃO_ARMAZENADO" \
-d "scope=Mail.ReadWrite Mail.Send offline_access"
#: SEMPRE verifique se há um novo refresh_token na resposta.
# Se estiver presente, substitua o armazenado imediatamente.
# Se ocorrer o erro invalid_grant, solicite ao usuário que se autentique novamente.Erros Comuns do AADSTS Decodificados
Os erros do Microsoft Graph OAuth seguem um padrão consistente de códigos de erro AADSTS. Estes são os mais comuns que você encontrará durante o desenvolvimento e a produção, com causas raiz e correções exatas.
| Código de erro | O que isso significa | Causa raiz e correção |
|---|---|---|
| AADSTS65001 | O consentimento não foi concedido para um ou mais dos escopos solicitados | O usuário não consentiu com os escopos do seu aplicativo, ou um administrador de locatário bloqueou o consentimento do usuário para o seu aplicativo. Correção: Inclua consentimento em sua URL de autorização para forçar uma tela de consentimento nova, ou envie a URL de consentimento do administrador para o administrador do tenant.Adicionar prompt=consentimento ou solicitar consentimento do administrador |
| AADSTS50011 | Erro de conflito de URI de redirecionamento | O redirect_uri Na sua solicitação, o URI de redirecionamento não corresponde exatamente a nenhum URI de redirecionamento registrado no seu registro de aplicativo Entra. Até mesmo uma diferença na barra final causa isso. Correção: Copie o URI exato do seu registro de aplicativo Entra e use-o literalmente.Correção: correspondência exata de URI no registro de aplicativo do Entra |
| AADSTS700016 | Aplicativo não encontrado no tenant | O id_cliente não existe no tenant contra o qual está sendo autenticado. Comum ao usar uma autoridade específica para o tenant (/{tenant-id}) para um aplicativo multi-inquilino. Correção: Use /comum ou /organizações autoridade para aplicativos multilocatário.Corrigir: mudar para a autoridade /common ou /organizations |
| AADSTS90099 | O aplicativo não foi autorizado neste tenant (consent_required) | O aplicativo existe, mas não foi consentido no tenant do usuário. Difere do AADSTS65001 no sentido de que o aplicativo inteiro é bloqueado, não apenas escopos específicos. Correção: Envie a URL de consentimento do administrador para o administrador de TI do cliente. Corrigir: URL de consentimento do administrador para administrador do locatário do cliente |
| AADSTS70011 | Concessão fornecida é inválida ou expirada | O token de atualização ou o código de autorização expirou ou foi revogado. Os códigos de autorização expiram em 10 minutos. Os tokens de atualização expiram após 90 dias de inatividade ou revogação pelo administrador. Correção: Solicitar ao usuário que se reautentique desde o início do fluxo OAuth. Correção: solicitar reautenticação completa |
| AADSTS50076 | Autenticação multifator é exigida pela política de Acesso Condicional | O tenant do usuário exige autenticação multifator para seu aplicativo. Esta é uma decisão do lado do cliente imposta pelo administrador do tenant. Seu aplicativo não pode contorná-la. O usuário precisa concluir o MFA. Se estiver usando o fluxo de código de autenticação, a Microsoft exibirá automaticamente o prompt de MFA no navegador. Problemas surgem em fluxos automatizados (credenciais de cliente) que não conseguem concluir o MFA. Esperado: o usuário deve completar a MFA |
| AADSTS50020 | Conta de usuário do provedor de identidade externo não existe no locatário | O usuário está tentando se autenticar com uma conta pessoal da Microsoft em um locatário que permite apenas contas organizacionais, ou vice-versa. Correção: Verifique seu endpoint de autoridade - se estiver usando /organizações, contas pessoais não conseguem autenticar. Mude para /comum se você precisar de ambos.Corrigir: mudar autoridade para /common |
| AADSTS53003 | Acesso bloqueado pela política de Acesso Condicional | A política de Acesso Condicional do locatário bloqueou completamente esta tentativa de autenticação (por exemplo, país bloqueado, dispositivo não gerenciado, aplicativo bloqueado). Esta é uma decisão do lado do cliente. Você não pode substituí-la. Apresente o erro ao usuário e aconselhe-o a contatar o administrador de TI. Lado do cliente: orientar o usuário a entrar em contato com o administrador de TI |
Pule 5 Semanas de Trabalho com OAuth com Unipile
Tudo neste guia - registro de aplicativo Entra, endpoints de autoridade, seleção de escopo, PKCE, rotação de token, tratamento de erros AADSTS - é tempo de engenharia que não impulsiona seu produto. O Unipile lida com toda a pilha OAuth do Microsoft Graph como um serviço gerenciado, para que sua equipe escreva uma chamada de API em vez de 500 linhas de código OAuth complexo.
import solicitações
UNIPILE_API_URL = "https://apiXXX.unipile.com:XXX"
UNIPILE_API_KEY = "your-api-key"
# Etapa 1: Gerar um link de autenticação hospedado para a Microsoft
response = requests.postagem(
"{UNIPILE_API_URL}/api/v1/hosted/accounts/link",
cabeçalhos={
"X-API-KEY": UNIPILE_API_KEY,
"Tipo-de-Conteúdo": "application/json"
},
json={
"tipo": "criar",
"fornecedores": ["MICROSOFT"],
"url_da_api": UNIPILE_API_URL,
"expiraEm": "31/12/2026 23:59:59",
# Opcional: vincule este link a um usuário específico
"nome": "id_do_usuário_123",
# Opcional: receber uma notificação quando a conta for vinculada
"url_de_notificacao": "https://app.yourproduct.com/webhooks/account-linked"
}
)
# Etapa 2: Redirecione o usuário para esta URL
url_autenticacao_hospedada = resposta.json()["url"]
Exemplo de #: https://account.unipile.com/[encoded-token]
# Unipile lida com: redirecionamento Entra, tela de consentimento, PKCE,
Troca de tokens #, atualização do armazenamento de tokens, gerenciamento de escopo
# Etapa 3: Após a autenticação, use a API de e-mail da Unipile para ler/enviar
emails = requisições.obter(
f"{UNIPILE_API_URL}/api/v1/emails",
cabeçalhos={"X-API-KEY": UNIPILE_API_KEY},
parâmetros={"id_da_conta": "id-conta-vinculada"}
)Perguntas frequentes
As perguntas mais comuns sobre o OAuth do Microsoft Graph para integração de e-mail, desde a seleção de escopos até o ciclo de vida do token e os fluxos de consentimento corporativo.
/comum endpoint de autoridade, um único registro de aplicativo do Microsoft Entra lida com a autenticação para contas pessoais do Outlook.com e contas corporativas/escolares do Microsoft 365. A chave é selecionar "Contas em qualquer diretório organizacional e contas pessoais da Microsoft" ao registrar seu aplicativo no portal do Azure.concessão_inválida erro. Lide com isso de forma elegante: marque a conta vinculada como necessitando de reautenticação e apresente um prompt de reautenticação claro em seu produto. Este é o comportamento esperado - uma decisão do lado do cliente além do seu controle.Mail.Read, Mail.ReadWritee Mail.Send são escopos de consentimento do usuário - usuários individuais podem aprová-los durante o fluxo OAuth. O consentimento do administrador é necessário apenas para permissões de aplicativo ou escopos de alto privilégio como User.Read.All. Alguns locatários empresariais configuram políticas que bloqueiam todo o consentimento de aplicativos de terceiros - essa é uma decisão do lado do cliente.concessão_inválida erros e substituir tokens de atualização antigos pelos novos retornados em cada resposta do token.consentimento para a sua URL de autorização para forçar uma tela de consentimento renovada. AADSTS90099Toda a aplicação não foi autorizada nesse inquilino - o administrador do inquilino precisa pré-aprovar seu aplicativo. Envie a URL de consentimento do administrador para o administrador de TI do cliente. Ambos os erros são comuns em cenários corporativos onde os inquilinos restringem o consentimento do usuário.Mail.ReadWrite e Mail.Send no mesmo escopo string. Note que Mail.ReadWrite e Mail.Send são escopos separados - ter acesso de leitura/gravação não concede automaticamente permissão de envio. Inclua sempre acesso_offline para garantir que você receba um token de atualização. Veja a Página da API de e-mail para detalhes de implementação.