Skip to main content
Conexões são credenciais que um usuário mantém para um serviço externo (Linear, GitHub, Slack, …). Seu app declara como essas credenciais são obtidas — um provedor de conexão — e as consome em tempo de execução para fazer chamadas autenticadas à API de terceiros. Atualmente, apenas o OAuth 2.0 tem suporte. Tipos de credenciais futuros (tokens de acesso pessoal, chaves de API, autenticação básica) serão conectados à mesma interface — apps que já usam defineConnectionProvider({ type: 'oauth', ... }) não precisarão migrar.
Um provedor de conexão descreve o handshake OAuth de que seu app precisa. O usuário clica em “Adicionar conexão” nas configurações do seu app, conclui a tela de consentimento do provedor e uma linha ConnectedAccount é criada no seu workspace.Uma configuração funcional precisa de dois arquivos — o provedor de conexão e uma declaração correspondente de serverVariables em defineApplication que contém as credenciais do cliente OAuth.
src/connection-providers/linear-connection.ts
src/application.config.ts
Pontos-chave:
  • name é a string de identificador exclusivo usada em listConnections({ providerName }) (kebab-case, deve corresponder a ^[a-z][a-z0-9-]*$).
  • displayName aparece na aba de configurações do app e na lista de ferramentas de IA.
  • clientIdVariable / clientSecretVariable são nomes, não valores — devem corresponder às chaves declaradas em defineApplication.serverVariables. Os client_id e client_secret reais são inseridos pelo administrador do servidor por meio da interface de registro do app e nunca são versionados no seu repositório.
  • Use serverVariables (não applicationVariables) — as credenciais OAuth são do servidor como um todo e há um app OAuth por servidor do Twenty.
  • Até que ambos os serverVariables sejam preenchidos, a aba de configurações do app mostra uma dica “precisa de administrador do servidor” e o botão “Adicionar conexão” fica desativado.
  • type: 'oauth' é o único valor compatível atualmente. O discriminador é compatível com versões futuras: tipos futuros ('pat', 'api-key', …) adicionarão novos blocos de subconfiguração ao lado de oauth.
O URL de callback do OAuth que seu provedor precisa adicionar à lista de permissões é:
Alguns provedores fornecem dados no momento da conexão que você precisa manter antes que a conexão possa ser usada — o exemplo clássico é o Slack, em que a resposta OAuth identifica o team_id do workspace pelo qual os eventos de entrada serão indexados. Defina onConnectLogicFunction para fazer referência a uma função lógica no mesmo app (pelo seu universalIdentifier), e ela será executada logo após o ConnectedAccount ser criado.
src/connection-providers/slack-connection.ts
O hook é executado de forma assíncrona no workspace que está se conectando (ele é enfileirado, não aguardado), portanto um hook lento ou com falha nunca bloqueia ou quebra o callback OAuth — torne-o idempotente e faça com que ele mesmo gerencie suas próprias novas tentativas. O manipulador recebe:
A partir daí, use getConnection(connectedAccountId) para ler o token de acesso atualizado e chamar a API do provedor (por exemplo, Slack auth.test) ou persistir um mapeamento com o armazenamento de chave-valor.
Dentro de um handler de função de lógica, listConnections({ providerName }) retorna as linhas ConnectedAccount deste app para o provedor fornecido, com tokens de acesso atualizados.
src/logic-functions/handlers/create-linear-issue-handler.ts
Cada conexão tem:Pontos-chave:
  • Passe { providerName } para filtrar por provedor; omita para obter todas as conexões que este app possui em todos os provedores.
  • O servidor atualiza transparentemente o token de acesso antes de retornar. Seu handler sempre vê um token utilizável (ou authFailedAt definido).
  • getConnection(id) é o equivalente de uma única linha.
Quando um usuário clica em “Adicionar conexão”, é solicitado que escolha uma visibilidade:
  • Apenas para mim — a credencial é privada para o usuário que a conectou. Qualquer função de lógica chamada em seu nome (gatilho de rota HTTP com isAuthRequired: true) a vê; gatilhos cron e eventos de banco de dados não.
  • Compartilhada no workspace — qualquer membro do workspace pode usar a credencial. Gatilhos de cron / banco de dados também a veem, pois não há um usuário da requisição.
Use a adequada para cada handler:
Várias conexões por (usuário, provedor) são permitidas, então o mesmo usuário pode manter “Linear pessoal” e “Linear de trabalho” lado a lado.
Para cada provedor de conexão, o administrador do servidor precisa primeiro registrar um app OAuth no serviço de terceiros.
  1. Acesse as configurações de desenvolvedor do provedor (por exemplo, https://linear.app/settings/api/applications/new).
  2. Defina a URI de redirecionamento como \<SERVER_URL>/auth/apps/callback.
  3. Copie o ID do cliente e o Segredo do cliente gerados.
  4. Abra o app instalado no Twenty como administrador do servidor → defina os valores nos serverVariables correspondentes.
  5. Os membros do workspace podem então adicionar conexões na seção Conexões de cada app.