Skip to content
Go back

Obtenção de Tokens de Autenticação para Microsoft Graph API

Published:  at  11:00 AM

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á:

  1. Registro de aplicativo no Microsoft Entra ID
  2. Permissões adequadas configuradas para seu aplicativo
  3. 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:

FluxoUso recomendadoInteratividadeSegurança
Client CredentialsAplicações daemon, serviços de backendNão-interativoAlta¹
Authorization CodeAplicações web, móveis, SPA²InterativoAlta
Device CodeDispositivos IoT, CLI, apps sem interfaceSemi-interativoAlta
Resource Owner PasswordSituações legadas³Não-interativoMédia
Implicit FlowSingle Page Applications (legado)InterativoMé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

  1. Utilize certificados em vez de segredos para fluxos client credentials sempre que possível
  2. Implementar PKCE (Proof Key for Code Exchange) para aplicações públicas
  3. Armazenar segredos e certificados em cofres seguros como Azure Key Vault
  4. Solicitar apenas as permissões mínimas necessárias (princípio de privilégio mínimo)
  5. Implementar expiração e renovação automática de tokens
  6. Usar validação de token no lado do servidor para aplicações web

Manipulação de Erros Comuns

Código de ErroDescriçãoSolução
AADSTS65001Consentimento do usuário necessárioSolicitar consentimento do administrador ou usuário
AADSTS7000215Permissão inválida solicitadaVerificar se as permissões estão registradas no aplicativo
AADSTS7000222Tipo de cliente erradoVerificar se está usando o fluxo correto para o tipo de aplicativo
AADSTS500011Credenciais inválidasVerificar ID do cliente, segredo ou certificado
AADSTS700016Aplicativo não encontradoConfirmar ID do aplicativo e inquilino

Ferramentas Úteis para Desenvolvimento

  1. Graph Explorer - Teste interativo de chamadas Graph API
  2. jwt.ms - Decodificador de tokens JWT
  3. MSAL Bibliotecas - SDKs oficiais para autenticação
  4. 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:

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.


Suggest Changes

Previous Post
Mapeamento de Claims