Todos os artigos
FT-CONNECTOR-OAUTH-V1· 1.2.0Integrações

OAuth 2.0 — Client Credentials grant (M2M)

Autenticação server-to-server via client_id + client_secret. Padrão pra Azure AD M2M, Auth0 M2M, Oracle OIC, SAP BTP Service Key.

Atualizado em 8/6/2026

OAuth 2.0 — Client Credentials grant



Grant server-to-server (sem usuário humano no flow). RFC 6749 §4.4.

Quando usar



  • Azure AD M2M (Microsoft Dynamics, integrações Microsoft Graph)
  • Auth0 M2M
  • Oracle ERP via Oracle Integration Cloud (OIC)
  • SAP BTP via Service Key
  • Salesforce Connected App (client_credentials flow)


Como configurar



No form de integração, em REST, escolha Autenticação = oauth2 e preencha:

CampoExemplo
Token Endpointhttps://login.microsoftonline.com/<tenant>/oauth2/v2.0/token
Client IDabc-def-123
Client Secret•••••••• (criptografado)
Scope (opcional)https://<org>.dynamics.com/.default


O Lefia gerencia o ciclo de vida do token automaticamente:

  1. Primeira chamada → POST no token endpoint (grant_type=client_credentials).
  2. Token recebido → criptografa e persiste em oauth_tokens por connection.
  3. Próximas chamadas → reusa o token até 30s antes do expires_at.
  4. Token vencendo → re-exchange transparente.


Limitações



  • Não devolve refresh_token (não é necessário — basta re-exchange).
  • Identidade no provider = a "app" (não um usuário).
  • Pra acessar dados em nome de um usuário, use Authorization Code ou JWT Bearer (OBO).


Tickets relacionados



  • #178 implementação base, #193 wireup REST connector.


Atualizacao (07/2026): a plataforma envia grant_type=client_credentials automaticamente — nao ha campo pra isso. Se o provedor so aceitar os parametros na QUERY string (caso do Salesforce, que devolve unsupported_grant_type quando vem no body), a plataforma detecta e reenvia sozinha. O mesmo fallback vale para os fluxos Authorization Code, Refresh Token e JWT Bearer.

OAuth 2.0 (usuário e senha) — fluxo legado (07/2026): para provedores antigos que exigem grant_type=password (ROPC), selecione o tipo "OAuth 2.0 (usuário e senha — legado)". Campos: Token Endpoint, usuário, senha e — se o provedor exigir — Client ID/Client Secret (opcionais). A plataforma envia o grant_type automaticamente, renova o token sozinha e usa o mesmo fallback de query string. Atenção: o ROPC é desencorajado no OAuth 2.1 — prefira Client Credentials sempre que o provedor suportar.

Histórico de versões

  • 1.2.0

    Novo tipo "OAuth 2.0 (usuario e senha — legado)" (auth_type oauth2_password): grant password/ROPC (RFC 6749 §4.3) como tipo EXPLICITO no select — nunca inferido dos campos. fetchTokenPassword via postTokenForm (herda fallback body->query), client_id/secret opcionais (public client), cache de token compartilhado (getAccessTokenCached grant-agnostico). Aviso na UI: fluxo legado, prefira Client Credentials. Pedido Dataquantica 28/07.

    7/28/2026 · updated

  • 1.1.0

    OAuth 2.0 client_credentials: fallback body->query quando o token endpoint devolve unsupported_grant_type. O Salesforce (client_credentials) NAO le os params do body form-urlencoded (RFC 6749), so da query — comprovado no Postman. Tenta body (padrao/seguro, secret fora da URL) e so nesse erro refaz com params na query. Generalizado a TODOS os grants (client_credentials, authorization_code, refresh_token, jwt_bearer) via helper unico postTokenForm + tokenErrorMessage.

    7/27/2026 · updated

  • 1.0.1

    OAuth 2.0 client_credentials: fix inicial do Salesforce — token endpoint devolvia unsupported_grant_type porque o Nexio mandava os params no body (RFC) e o Salesforce so le da query. fetchTokenRaw passou a refazer com params na query nesse erro. (A generalizacao pros 4 grants veio na 1.1.0.)

    7/24/2026 · updated

  • 1.0.0

    REST connector com OAuth 2.0 Client Credentials. ConnectionConfig estendido com authType + oauthContext. restConnector.test/.send agora cobre api_key, basic, bearer, oauth2 (com e sem cache em oauth_tokens) + legacy fallback + headers extras JSON. Routes admin/test-connection, admin/test-integration, sap/test-connection e pipeline process-message.sendToDestination wireados para passar credentials reais + authType + oauthContext. Fecha #193 + bug ortogonal de credentials: {} vazio. 10 testes unit novos.

    5/16/2026 · new