Skip to content
Go back

Fluxo Client Credentials

Published:  at  10:00 AM

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:

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

  1. Prefira certificados: Use certificados em vez de segredos quando possível
  2. Rotação de credenciais: Implemente rotação periódica de segredos/certificados
  3. Mínimo privilégio: Solicite apenas as permissões necessárias
  4. Armazenamento seguro: Armazene segredos em Azure Key Vault ou outro cofre de senhas
  5. Monitoramento: Implemente monitoramento e alertas para uso de credenciais
  6. Temporizador de expiração: Defina prazos curtos de expiração para segredos

Cenários de Uso Comuns


Suggest Changes

Previous Post
Fluxo Device Code
Next Post
Proprietários de Grupos Microsoft 365