Fluxo de Credenciais de Cliente
O fluxo de credenciais de cliente (client credentials) é um dos fluxos de concessão OAuth 2.0 mais utilizados para cenários de comunicação aplicação-para-aplicação. Este fluxo:
- Permite que uma aplicação seja autenticada sem intervenção do utilizador
- É adequado para processos automatizados e background jobs
- Usa um segredo ou certificado para autenticação
- Fornece um token de acesso limitado ao escopo das permissões concedidas
Implementação com PowerShell
Exemplo de implementação do fluxo de credenciais de cliente usando PowerShell:
# Parâmetros de autenticação
$tenantId = "contoso.onmicrosoft.com" # Nome ou ID do tenant
$clientId = "00000000-0000-0000-0000-000000000000" # ID da aplicação
$clientSecret = "your-client-secret" # Segredo da aplicação
# Construir a requisição
$tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$body = @{
client_id = $clientId
client_secret = $clientSecret
scope = "https://graph.microsoft.com/.default"
grant_type = "client_credentials"
}
# Obter o token
$tokenResponse = Invoke-RestMethod -Uri $tokenUrl -Method Post -Body $body
# Extrair o token de acesso
$accessToken = $tokenResponse.access_token
# Usar o token para chamar o Microsoft Graph
$headers = @{
"Authorization" = "Bearer $accessToken"
}
$graphResponse = Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users" -Headers $headers
$graphResponse.value
Implementação com Certificado
Usando certificado ao invés de segredo, o que é mais seguro:
# Carregar certificado
$certThumbprint = "0000000000000000000000000000000000000000"
$certificate = Get-Item "Cert:\CurrentUser\My\$certThumbprint"
# Criar asserção JWT
$jwtHeader = @{
alg = "RS256"
typ = "JWT"
x5t = [System.Convert]::ToBase64String($certificate.GetCertHash())
} | ConvertTo-Json -Compress
$now = [int](Get-Date -UFormat %s)
$jwtPayload = @{
aud = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
exp = $now + 3600
iss = $clientId
jti = [guid]::NewGuid()
nbf = $now
sub = $clientId
} | ConvertTo-Json -Compress
$encodedHeader = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($jwtHeader)).Split('=')[0].Replace('+', '-').Replace('/', '_')
$encodedPayload = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($jwtPayload)).Split('=')[0].Replace('+', '-').Replace('/', '_')
$toSign = [Text.Encoding]::UTF8.GetBytes($encodedHeader + "." + $encodedPayload)
$rsa = $certificate.PrivateKey
$signature = [Convert]::ToBase64String($rsa.SignData($toSign, [Security.Cryptography.HashAlgorithmName]::SHA256, [Security.Cryptography.RSASignaturePadding]::Pkcs1)).Split('=')[0].Replace('+', '-').Replace('/', '_')
$jwt = "$encodedHeader.$encodedPayload.$signature"
# Obter token
$tokenBody = @{
client_id = $clientId
client_assertion_type = "urn:ietf:params:oauth:client-assertion-type:jwt-bearer"
client_assertion = $jwt
scope = "https://graph.microsoft.com/.default"
grant_type = "client_credentials"
}
$tokenResponse = Invoke-RestMethod -Uri $tokenUrl -Method Post -Body $tokenBody
$accessToken = $tokenResponse.access_token
Melhores Práticas de Segurança
- Prefira certificados: Use certificados em vez de segredos quando possível
- Rotação de credenciais: Implemente rotação periódica de segredos/certificados
- Mínimo privilégio: Solicite apenas as permissões necessárias
- Armazenamento seguro: Armazene segredos em Azure Key Vault ou outro cofre de senhas
- Monitoramento: Implemente monitoramento e alertas para uso de credenciais
- Temporizador de expiração: Defina prazos curtos de expiração para segredos
Cenários de Uso Comuns
- Sincronização de dados entre sistemas
- Processamento em background
- Jobs agendados
- APIs de sistema para sistema
- Microserviços que precisam se comunicar entre si
- Automação de processos de negócio