defineConnectionProvider({ type: 'oauth', ... }) を使用しているアプリは移行の必要がありません。
defineConnectionProvider
アプリの接続をどのように取得するかを宣言する
defineConnectionProvider
アプリの接続をどのように取得するかを宣言する
接続プロバイダーは、アプリに必要な OAuth のハンドシェイクを記述します。 ユーザーがアプリの設定で”接続を追加”をクリックし、プロバイダーの同意画面を完了すると、そのワークスペースに 主なポイント:
ConnectedAccount の行が作成されます。動作するセットアップには、2 つのファイルが必要です — 接続プロバイダーと、OAuth クライアント認証情報を保持する defineApplication 上の対応する serverVariables 宣言です。src/connection-providers/linear-connection.ts
src/application.config.ts
listConnections({ providerName })で使用される一意の識別子文字列がnameです(kebab-case、^[a-z][a-z0-9-]*$に一致する必要があります)。displayNameはアプリごとの設定タブおよび AI ツール一覧に表示されます。clientIdVariable/clientSecretVariableは値ではなく名前です —defineApplication.serverVariablesで宣言されたキーと一致している必要があります。 実際のclient_idとclient_secretは、アプリ登録 UI を通じてサーバー管理者が入力し、あなたのリポジトリにコミットされることはありません。applicationVariablesではなくserverVariablesを使用してください — OAuth の認証情報はサーバー全体で共有され、Twenty サーバーごとに 1 つの OAuth アプリとなります。- 両方の
serverVariablesが入力されるまで、アプリごとの設定タブには”サーバー管理者が必要”というヒントが表示され、“接続を追加”ボタンは無効になります。 - 現在サポートされる値は
type: 'oauth'のみです。 この判別子は前方互換です。将来のタイプ('pat'、'api-key'、…) は、oauthに並ぶ新しいサブ設定ブロックを追加します。
接続時にロジック関数を実行する
接続が確立された瞬間に反応する
接続時にロジック関数を実行する
接続が確立された瞬間に反応する
一部のプロバイダは、接続時に、接続が実際に利用可能になる前に永続化しておく必要があるデータを渡してきます。典型的な例は Slack で、OAuth レスポンスに、受信イベントのキーとして使用されるワークスペースの このフックは接続中のワークスペース内で非同期に実行されます(待機されずにキューに入れられるため)、フックの実行が遅かったり失敗したりしても OAuth コールバックをブロックしたり壊したりすることは決してありません。冪等性を持たせ、自身でリトライ処理を行うようにしてください。 ハンドラーは次の内容を受け取ります:そこから
team_id が含まれます。 onConnectLogicFunction を、同じアプリ内のロジック関数を universalIdentifier で参照するように設定すると、ConnectedAccount が作成された直後にその関数が実行されます。src/connection-providers/slack-connection.ts
getConnection(connectedAccountId) を使用して最新のアクセストークンを読み取り、プロバイダーの API(例: Slack auth.test)を呼び出すか、key-value store を使ってマッピングを永続化します。切断時にロジック関数を実行する
接続が削除されたときにクリーンアップを行う
切断時にロジック関数を実行する
接続が削除されたときにクリーンアップを行う
アプリが接続時に確保したものは、接続が解除されたときに必ず解放しなければなりません。 例えば、接続時に on-connect フックと同様に、切断処理中のワークスペースで非同期に実行され、切断をブロックすることはありません。 ハンドラーは同じペイロード構造を受け取ります:フックが実行される時点では
team_id を確保する Slack 連携は、その確保を解放して、別のワークスペースが同じ Slack チームを接続できるようにしなければなりません。 同じアプリ内のロジック関数を参照するように onDisconnectLogicFunction を設定すると、ConnectedAccount が削除された直後にその関数が実行されます。src/connection-providers/slack-connection.ts
ConnectedAccount はすでに削除されているため、getConnection(connectedAccountId) はもう解決されません。 クリーンアップに必要なもの(team_id や外部サブスクリプション ID など)は、接続時に connectedAccountId をキーとして key-value store に書き込まれている必要があります。このフックは、接続が単独で削除されたときに発火します。 アプリをアンインストールすると、代わりにデータベースのカスケードによって接続が削除されるため、その場合はこのフックは実行されません。 その経路用に defineApplication 上で uninstallLogicFunction を宣言します。これはアプリのメタデータが削除される前に実行されるため、まだ listConnections を呼び出して残っているものをクリーンアップできます。listConnections / getConnection
ロジック関数から接続を使用する
listConnections / getConnection
ロジック関数から接続を使用する
ロジック関数ハンドラー内では、各接続には次の項目があります:
listConnections({ providerName }) が指定したプロバイダーに対するこのアプリの ConnectedAccount 行を、更新済みのアクセストークン付きで返します。src/logic-functions/handlers/create-linear-issue-handler.ts
主なポイント:
- プロバイダーで絞り込むには
{ providerName }を渡します。省略すると、このアプリが保有するすべてのプロバイダーの接続を取得します。 - サーバーは返却前にアクセストークンを透過的に更新します。 ハンドラーは常に利用可能なトークン(または
authFailedAtが設定された状態)を受け取ります。 getConnection(id)は単一行の取得に相当します。
ユーザー単位 vs ワークスペース共有の可視性
ユーザーがプライベートと共有の認証情報を選ぶ方法
ユーザー単位 vs ワークスペース共有の可視性
ユーザーがプライベートと共有の認証情報を選ぶ方法
ユーザーが”接続を追加”をクリックすると、可視性の選択を求められます:(ユーザー、プロバイダー)ごとに複数の接続が許可されているため、同一ユーザーが “Personal Linear” と “Work Linear” を並行して保持できます。
- 自分だけ — 認証情報は接続したユーザー専用です。 そのユーザーの権限で呼び出される任意のロジック関数(
isAuthRequired: trueの HTTP ルートトリガー)は参照できますが、cron トリガーやデータベースイベントは参照できません。 - ワークスペースで共有 — どのワークスペースメンバーでもその認証情報を使用できます。 リクエストユーザーを持たないため、Cron/データベースのトリガーからも参照されます。
一度きりのプロバイダー設定
サードパーティサービスに OAuth アプリを登録する
一度きりのプロバイダー設定
サードパーティサービスに OAuth アプリを登録する
各接続プロバイダーごとに、まずサーバー管理者がサードパーティ側で OAuth アプリを登録する必要があります。
- プロバイダーの開発者設定に移動します(例: https://linear.app/settings/api/applications/new)。
- Redirect URI を
\<SERVER_URL>/auth/apps/callbackに設定します。 - 生成された Client ID と Client Secret をコピーします。
- サーバー管理者として Twenty でインストール済みアプリを開き、対応する
serverVariablesに値を設定します。 - その後、ワークスペースメンバーはアプリごとの Connections セクションから接続を追加できます。