Ir para o conteúdo

Obtendo o Token

Endpoint de autenticação

POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token

Parâmetros

Campo Valor
grant_type client_credentials
client_id Seu client_id (fornecido pela CTC)
client_secret Seu client_secret (fornecido pela CTC)
scope api://{api_client_id}/.default

O scope .default

O sufixo /.default instrui o Entra ID a conceder todos os escopos para os quais sua aplicação foi previamente autorizada. As roles atribuídas ao seu client_id determinarão quais domínios você pode acessar.


Exemplos

curl -X POST \
  "https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id={client_id}" \
  -d "client_secret={client_secret}" \
  -d "scope=api://{api_client_id}/.default"
import requests

tenant_id = "{tenant_id}"
client_id = "{client_id}"
client_secret = "{client_secret}"
api_client_id = "{api_client_id}"

response = requests.post(
    f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token",
    data={
        "grant_type": "client_credentials",
        "client_id": client_id,
        "client_secret": client_secret,
        "scope": f"api://{api_client_id}/.default",
    },
)

token = response.json()["access_token"]
const params = new URLSearchParams({
  grant_type: "client_credentials",
  client_id: "{client_id}",
  client_secret: "{client_secret}",
  scope: "api://{api_client_id}/.default",
});

const response = await fetch(
  `https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token`,
  {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: params,
  }
);

const { access_token } = await response.json();
using var client = new HttpClient();

var body = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("grant_type", "client_credentials"),
    new KeyValuePair<string, string>("client_id", "{client_id}"),
    new KeyValuePair<string, string>("client_secret", "{client_secret}"),
    new KeyValuePair<string, string>("scope", "api://{api_client_id}/.default"),
});

var response = await client.PostAsync(
    $"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token",
    body
);

var json = await response.Content.ReadFromJsonAsync<JsonElement>();
var accessToken = json.GetProperty("access_token").GetString();

Resposta

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIs..."
}
Campo Descrição
token_type Sempre Bearer
expires_in Validade em segundos (tipicamente 3599 ≈ 1 hora)
access_token JWT a ser enviado nas requisições

Cache do token

Não solicite um novo token a cada requisição. Reutilize o token até ~60 segundos antes de expirar (expires_in - 60). Exceder o rate limit de autenticação pode bloquear temporariamente seu client_id.


Usando o token

Envie o token no header Authorization de cada requisição à API:

curl -X POST \
  "https://api.ctc.com.br/v1/integrations/{partnerId}/produtividade" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '{ "data": [...] }'

Erros comuns

Código Mensagem Causa
401 Token inválido ou expirado. Token ausente, expirado ou assinado com chave errada
403 O partnerId na URL não corresponde ao cliente autenticado. {partnerId} na URL ≠ client_id do token
401 AADSTS700016 client_id não encontrado no tenant
401 AADSTS7000215 client_secret inválido ou expirado