暫定メモ — このフローはまだ開発初期段階にあるため、以下の詳細は
変更される可能性があります。
前提条件
- コールバックの許可リスト。 利用するすべての
callback_urlは、その統合用の Devin の許可リストに登録されている必要があります。これは Cognition 側で設定するため、事前に正確な URL をお知らせください。リストにない URL は拒否されます。 - Outposts が有効であること。 顧客のアカウントで Outposts が有効になっている必要があります。
- 管理者による承認。 接続の承認には、
enterprise-settingsと サービスユーザー 管理の両方の権限を持つ Devin 管理者が必要です。パートナーが Devin トークンを必要とすることはありません。管理者が自身のブラウザのセッションで承認します。
フローの概要
1. PKCE の verifier と challenge を生成する
- 高エントロピーのランダムな
code_verifierを生成します。文字数は 43~128 文字で、使用する文字は未予約文字[A-Za-z0-9-._~]に限ります (例: パディングを除いたbase64url(random 32 bytes)) 。 - verifier の SHA-256 をパディングなしの base64url で表したものとして、
code_challengeを導出します (PKCE “S256”) :
code_verifier はサーバー側に保存してください (最終的に返ってくるコールバックと対応付けるために利用する state にひも付けます) 。verifier は絶対にブラウザに送信しないでください。バックエンドから渡すのは challenge のみです。
2. 管理者を接続ページにリダイレクトする
管理者がサインインしていない場合、接続ページはこれらのパラメータを一時保存し、まずサインインを求めたうえで処理を再開します。
3. 管理者による確認
outpost_image も) を含む確認画面が表示されます。管理者が Connect をクリックすると、Devin は権限、コールバックの許可リスト、アウトポスト名が使用可能であることを検証したうえで、暗号化された使い捨てコード (TTL は 10 分) を保存し、1回限りのコードを付けてお客様の app にリダイレクトします。
アウトポスト もサービスユーザーもまだ存在せず、コードが引き換えられたとき (ステップ5) にのみ作成されます。未使用のコードはそのまま期限切れになります。
4. Devin がコードをお客様の callback_url にリダイレクトします
callback_url にリダイレクトされます:
5. サーバー間でコードを交換する
code_verifierを取得し、トークンエンドポイントに対してコードを引き換えます。これは、フォームエンコードされたOAuth形式のトークンリクエストです。
6. 認証情報を受け取る
Cache-Control: no-storeが付与されているため、キャッシュしないでください。
7. アウトポスト ワーカーを実行する
access_token と api_base_url を安全に保存し、そのトークンを Bearer 認証情報として利用して アウトポスト に対する アウトポスト ワーカーを実行します。
エラー処理
400 が返されます。
invalid_grant は回復不能なエラーとして扱ってください。保存されている code_verifier を破棄し、フローをステップ1からやり直してください。
セキュリティに関する注意事項
- トークンがブラウザを経由することはありません。 リダイレクトで中継されるのは使い捨てのコードのみで、サービスユーザーのトークンはサーバー間のやり取りでのみ返されます。
- PKCE により、コードはあなたに紐付けられます。 あなたのバックエンドだけが保持する
code_verifierがなければコードは使えないため、リダイレクト (またはコード) を傍受しただけでは引き換えできません。 - コードは使い捨てで、有効期間も短くなっています。 引き換え時にコードはその場で消費され、10 分後には失効します。
- コールバック URL は許可リストに登録されています。 Devin がコードを中継するのは、Cognition があなたの統合向けに事前承認した
callback_urlのみです。 - そのコードが接続をリクエストしたユーザーのものであることを確認してください。 コールバックに返されたコードが、最初に接続をリクエストしたのと同じユーザーのものであることを確認してください。これにより、攻撃者がユーザーをだまして、気付かないうちに Devin を攻撃者が管理するサンドボックスにバインドさせることを防げます。
outpost_nameは適切な値を指定してください。 管理者がこれを上書きする場合があり、指定する名前はあくまで提案にすぎません。

