Obtenção de Tokens de Autenticação para Microsoft Graph API
A Microsoft Graph API se tornou o método padrão para interagir programaticamente com todos os serviços da plataforma Microsoft 365. Seja para gerenciar usuários no Entra ID (antigo Azure AD), manipular documentos no SharePoint, ou acessar e-mails no Exchange Online, tudo passa pela Graph API.
Para utilizar esta API, é essencial compreender como obter tokens de autenticação OAuth 2.0 corretamente. Este artigo apresenta os principais métodos disponíveis, incluindo exemplos práticos de implementação.
Pré-requisitos fundamentais
Antes de iniciar qualquer implementação, você precisará:
- Registro de aplicativo no Microsoft Entra ID
- Permissões adequadas configuradas para seu aplicativo
- Credenciais apropriadas para o tipo de fluxo escolhido
Escolhendo o fluxo de autenticação correto
Dependendo do contexto da sua aplicação, você precisará escolher um dos seguintes fluxos OAuth 2.0:
Fluxo | Uso recomendado | Interatividade | Segurança |
---|---|---|---|
Client Credentials | Aplicações daemon, serviços de backend | Não-interativo | Alta¹ |
Authorization Code | Aplicações web, móveis, SPA² | Interativo | Alta |
Device Code | Dispositivos IoT, CLI, apps sem interface | Semi-interativo | Alta |
Resource Owner Password | Situações legadas³ | Não-interativo | Média |
Implicit Flow | Single Page Applications (legado) | Interativo | Média |
¹ Com uso adequado de certificados ou segredos gerenciados ² Com PKCE para SPA e aplicativos nativos ³ Não recomendado para novas implementações
Fluxo Client Credentials
Ideal para aplicações daemon, serviços de backend ou scripts que precisam acessar recursos sem a presença de um usuário.
Exemplo com PowerShell e Microsoft Graph SDK
# Instalar o módulo se necessário
# Install-Module Microsoft.Graph.Authentication -Scope CurrentUser
# Com segredo
Connect-MgGraph -ClientId "11111111-1111-1111-1111-111111111111" `
-TenantId "22222222-2222-2222-2222-222222222222" `
-ClientSecret "cliente_secreto_aqui" `
-Scopes "https://graph.microsoft.com/.default"
# Com certificado
Connect-MgGraph -ClientId "11111111-1111-1111-1111-111111111111" `
-TenantId "22222222-2222-2222-2222-222222222222" `
-CertificateName "CN=MeuCertificado" `
-Scopes "https://graph.microsoft.com/.default"
Exemplo com Python e requests
import requests
import msal
# Configurações do aplicativo
app_id = '11111111-1111-1111-1111-111111111111'
tenant_id = '22222222-2222-2222-2222-222222222222'
client_secret = 'seu_segredo_aqui'
# Criar um contexto de aplicativo confidencial
app = msal.ConfidentialClientApplication(
client_id=app_id,
client_credential=client_secret,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
# Adquirir token para Graph API
result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
if "access_token" in result:
# Fazer uma chamada à Graph API
headers = {
'Authorization': f'Bearer {result["access_token"]}',
'Content-Type': 'application/json'
}
graph_data = requests.get("https://graph.microsoft.com/v1.0/users", headers=headers)
print(graph_data.json())
else:
print(f"Erro: {result.get('error')}")
print(f"Descrição: {result.get('error_description')}")
Fluxo de Código de Autorização
Recomendado para aplicações web e móveis onde um usuário está presente para autenticar.
Exemplo com Node.js e MSAL
// Instalar: npm install @azure/msal-node
const msal = require('@azure/msal-node');
const config = {
auth: {
clientId: "11111111-1111-1111-1111-111111111111",
authority: "https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222",
clientSecret: "seu_segredo_aqui"
}
};
// Criar aplicação confidencial
const pca = new msal.ConfidentialClientApplication(config);
// Gerar URL de login para redirecionar o usuário
const authCodeUrlParameters = {
scopes: ["user.read", "mail.read"],
redirectUri: "http://localhost:3000/auth/redirect",
};
// Em seu endpoint de login:
async function login(req, res) {
const authUrl = await pca.getAuthCodeUrl(authCodeUrlParameters);
res.redirect(authUrl);
}
// Em seu endpoint de redirecionamento:
async function handleRedirect(req, res) {
const tokenRequest = {
code: req.query.code,
scopes: ["user.read", "mail.read"],
redirectUri: "http://localhost:3000/auth/redirect",
};
try {
const response = await pca.acquireTokenByCode(tokenRequest);
// Token obtido com sucesso
console.log(response.accessToken);
} catch (error) {
console.log(error);
}
}
Fluxo de Código de Dispositivo
Ideal para CLI, IoT e situações onde não existe interface direta para entrada de credenciais.
Exemplo com C# e Microsoft Identity Client
// Instalar via NuGet: Microsoft.Identity.Client
using Microsoft.Identity.Client;
using System;
using System.Threading.Tasks;
public class DeviceCodeExample
{
public static async Task GetTokenViaDeviceCode()
{
var app = PublicClientApplicationBuilder
.Create("11111111-1111-1111-1111-111111111111")
.WithAuthority(AzureCloudInstance.AzurePublic, "22222222-2222-2222-2222-222222222222")
.WithDefaultRedirectUri()
.Build();
string[] scopes = new string[] { "user.read" };
var result = await app.AcquireTokenWithDeviceCode(scopes, deviceCodeResult => {
// Mostrar instrução para o usuário
Console.WriteLine(deviceCodeResult.Message);
return Task.FromResult(0);
}).ExecuteAsync();
Console.WriteLine($"Token adquirido: {result.AccessToken}");
}
}
Fluxo Resource Owner Password Credentials (não recomendado)
Use apenas em cenários legados onde outras abordagens não são viáveis.
Exemplo com Java
// Exemplo usando biblioteca Auth0 java-jwt
import com.auth0.jwt.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.entity.*;
import org.apache.http.util.*;
import org.json.*;
public class ROPCFlowExample {
public static String getToken() throws Exception {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(
"https://login.microsoftonline.com/22222222-2222-2222-2222-222222222222/oauth2/v2.0/token");
// Parâmetros para ROPC
StringEntity entity = new StringEntity(
"client_id=11111111-1111-1111-1111-111111111111" +
"&scope=https://graph.microsoft.com/.default" +
"&username=usuario@seudominio.com" +
"&password=senhaDoUsuario" +
"&grant_type=password");
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
CloseableHttpResponse response = client.execute(httpPost);
String jsonResponse = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = new JSONObject(jsonResponse);
return jsonObject.getString("access_token");
}
}
Boas Práticas de Segurança
- Utilize certificados em vez de segredos para fluxos client credentials sempre que possível
- Implementar PKCE (Proof Key for Code Exchange) para aplicações públicas
- Armazenar segredos e certificados em cofres seguros como Azure Key Vault
- Solicitar apenas as permissões mínimas necessárias (princípio de privilégio mínimo)
- Implementar expiração e renovação automática de tokens
- Usar validação de token no lado do servidor para aplicações web
Manipulação de Erros Comuns
Código de Erro | Descrição | Solução |
---|---|---|
AADSTS65001 | Consentimento do usuário necessário | Solicitar consentimento do administrador ou usuário |
AADSTS7000215 | Permissão inválida solicitada | Verificar se as permissões estão registradas no aplicativo |
AADSTS7000222 | Tipo de cliente errado | Verificar se está usando o fluxo correto para o tipo de aplicativo |
AADSTS500011 | Credenciais inválidas | Verificar ID do cliente, segredo ou certificado |
AADSTS700016 | Aplicativo não encontrado | Confirmar ID do aplicativo e inquilino |
Ferramentas Úteis para Desenvolvimento
- Graph Explorer - Teste interativo de chamadas Graph API
- jwt.ms - Decodificador de tokens JWT
- MSAL Bibliotecas - SDKs oficiais para autenticação
- Postman Collections para Graph - Coleções para testes via Postman
Considerações Finais
A escolha do fluxo de autenticação correto é fundamental para garantir tanto a segurança quanto a usabilidade da sua aplicação. Para aplicações modernas, os fluxos recomendados são:
- Aplicações backend e serviços: Client Credentials Flow com certificados
- Aplicações web tradicionais: Authorization Code Flow
- SPAs: Authorization Code Flow com PKCE
- Aplicações móveis: Authorization Code Flow com PKCE
- CLIs e ferramentas de linha de comando: Device Code Flow
Lembre-se que a Microsoft continua evoluindo a plataforma de identidade, então é importante manter-se atualizado com as melhores práticas e recomendações mais recentes.
Para informações adicionais, consulte a documentação oficial da Microsoft Identity Platform.