Obtendo o Token
Endpoint de autenticação
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
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 |