logo
Development
検索
SDK API リファレンス

SDK API リファレンス

公式 SDK は フレームワーク非依存・ランタイム依存ゼロ の 2 つのパッケージで、GitHub でソースコードを取得できます。アドレスは次のとおりです:https://github.com/gptbots/workspace-extension-sdk

パッケージ名 実行場所 エントリ
@gptbots/workspace-extension-verify バックエンド(Node ≥ 18) verifyWsa, exchangeWorkspaceCode
@gptbots/workspace-extension-sdk ブラウザ consumeHandoff, startWorkspaceLogin, completeWorkspaceLogin

どちらのパッケージも ESM"type": "module")です。CommonJS プロジェクトでは動的な import() を使うか、ESM に切り替えてください。


バックエンドパッケージ @gptbots/workspace-extension-verify

verifyWsa(token, options): WorkspaceIdentity

wsa を検証してワークスペース ID を返します。検証順序:署名 → issaud → 期限(exp±leeway、iat/nbf を含む) → 必須クレーム

interface VerifyOptions { secret?: string; // HS256 シークレット(per-app または共有)。HS256 検証時は必須 publicKey?: string; // RS256 PEM 公開鍵。RS256 検証時は必須(ロードマップ) audience: string; // 拡張アプリの host、トークンの aud と一致する必要がある(必須) issuer?: string; // デフォルト 'gptbots-workspace' leewaySeconds?: number; // 時計のずれの許容(秒)、デフォルト 30 algorithms?: ('HS256' | 'RS256')[]; // デフォルト ['HS256'] } interface WorkspaceIdentity { accountId: string; // = JWT sub role: 'OWNER' | 'ADMIN' | 'MEMBER'; // 未知の値は MEMBER に正規化 workspaceId: string; // = JWT workspace_id username?: string; email?: string; avatar?: string; appName?: string; issuedAt?: number; // = iat(秒) expiresAt?: number; // = exp(秒) }
                      
                      interface VerifyOptions {
  secret?: string;        // HS256 シークレット(per-app または共有)。HS256 検証時は必須
  publicKey?: string;     // RS256 PEM 公開鍵。RS256 検証時は必須(ロードマップ)
  audience: string;       // 拡張アプリの host、トークンの aud と一致する必要がある(必須)
  issuer?: string;        // デフォルト 'gptbots-workspace'
  leewaySeconds?: number; // 時計のずれの許容(秒)、デフォルト 30
  algorithms?: ('HS256' | 'RS256')[]; // デフォルト ['HS256']
}

interface WorkspaceIdentity {
  accountId: string;                  // = JWT sub
  role: 'OWNER' | 'ADMIN' | 'MEMBER'; // 未知の値は MEMBER に正規化
  workspaceId: string;                // = JWT workspace_id
  username?: string; email?: string; avatar?: string; appName?: string;
  issuedAt?: number;   // = iat(秒)
  expiresAt?: number;  // = exp(秒)
}

                    
このコードブロックをポップアップで表示
  • exp は必須:欠落または有限でない数値 → MissingClaim をスロー(「永久に期限切れにならない」とは扱われません)。
  • iat / nbf(存在する場合)が leeway を超えて未来 → NotYetValid をスロー。
  • 失敗時は WsaVerificationError.code 付き)をスロー;呼び出し側の設定ミス(シークレット欠落など)は TypeError をスロー。

WsaVerificationError.code の値:

code 意味
InvalidToken トークンが空 / 構造が不正 / segment が JSON オブジェクトでない
InvalidSignature 署名が不一致(シークレットの誤り、改ざん)
Expired 期限切れ(exp + leeway より前)
NotYetValid iat/nbf が未来(leeway を超過)
WrongIssuer iss ≠ 期待値
WrongAudience aud ≠ あなたの audience
MissingClaim exp / sub / role / workspace_id が欠落
UnsupportedAlgorithm alg がホワイトリスト外(デフォルトは HS256 のみ)

exchangeWorkspaceCode(options): Promise<WorkspaceCodeExchangeResult>

プルログイン用:拡張アプリのバックエンドで 使い捨ての code + PKCE codeVerifierwsa に交換します。ブラウザで呼び出さないでください。

interface ExchangeWorkspaceCodeOptions { tokenUrl: string; // プラットフォームの /token エンドポイント(絶対 URL) code: string; // コールバックで取得した使い捨ての認可コード codeVerifier: string; // code_challenge に対応する PKCE verifier fetch?: typeof fetch; // fetch を注入可能(テスト/古いランタイム);デフォルトはグローバル fetch timeoutMs?: number; // リクエストタイムアウト、デフォルト 10000;0 を渡すと無効 } interface WorkspaceCodeExchangeResult { wsa: string; // 署名済みの wsa、verifyWsa に渡す tokenType?: string; // 'Bearer' expiresIn?: number; // wsa の有効期限(秒) }
                      
                      interface ExchangeWorkspaceCodeOptions {
  tokenUrl: string;      // プラットフォームの /token エンドポイント(絶対 URL)
  code: string;          // コールバックで取得した使い捨ての認可コード
  codeVerifier: string;  // code_challenge に対応する PKCE verifier
  fetch?: typeof fetch;  // fetch を注入可能(テスト/古いランタイム);デフォルトはグローバル fetch
  timeoutMs?: number;    // リクエストタイムアウト、デフォルト 10000;0 を渡すと無効
}

interface WorkspaceCodeExchangeResult {
  wsa: string;           // 署名済みの wsa、verifyWsa に渡す
  tokenType?: string;    // 'Bearer'
  expiresIn?: number;    // wsa の有効期限(秒)
}

                    
このコードブロックをポップアップで表示
  • 通信失敗 / 非 2xx / 業務 code≠0403209 invalid_grant403210 invalid_verifier など)/ data.wsa の欠落 → Error をスロー。
  • タイムアウト時は token exchange timed out after <ms>ms をスロー(デフォルト 10s。プラットフォームの遅い応答であなたのバックエンドがハングするのを防ぐ)。

Express ミドルウェアの例

import { verifyWsa, WsaVerificationError } from '@gptbots/workspace-extension-verify'; export function requireWorkspaceIdentity(secret: string, audience: string) { return (req, res, next) => { try { req.identity = verifyWsa(req.body.wsa, { secret, audience }); next(); } catch (e) { const code = e instanceof WsaVerificationError ? e.code : 'Error'; res.status(401).json({ code }); } }; }
                      
                      import { verifyWsa, WsaVerificationError } from '@gptbots/workspace-extension-verify';

export function requireWorkspaceIdentity(secret: string, audience: string) {
  return (req, res, next) => {
    try {
      req.identity = verifyWsa(req.body.wsa, { secret, audience });
      next();
    } catch (e) {
      const code = e instanceof WsaVerificationError ? e.code : 'Error';
      res.status(401).json({ code });
    }
  };
}

                    
このコードブロックをポップアップで表示

ブラウザパッケージ @gptbots/workspace-extension-sdk

プッシュ(Push handoff)

readHandoffToken(search?, paramName?): string | null

純粋関数。クエリ文字列から生の wsa を読み取ります。search はデフォルト location.searchparamName はデフォルト 'wsa'

stripHandoffToken(paramName?, ctx?): void

history.replaceState で現在の URL から wsa を除去し、アドレスバー/履歴/Referer に残らないようにします。ブラウザ外では安全な no-op。ctx?: { history?, location? } を注入可能(テスト)。

consumeHandoff(options): Promise<WorkspaceIdentity>

use 段階の便利フロー:wsa を読む → 拡張アプリバックエンドへ POST → 成功後 wsa を消去 → ID を返す。

interface ConsumeHandoffOptions { exchangeUrl: string; // 拡張アプリのバックエンド検証インターフェース fetch?: typeof fetch; // 注入可能 search?: string; // デフォルト location.search paramName?: string; // デフォルト 'wsa' strip?: boolean; // デフォルト true(成功時のみ消去) }
                      
                      interface ConsumeHandoffOptions {
  exchangeUrl: string;   // 拡張アプリのバックエンド検証インターフェース
  fetch?: typeof fetch;  // 注入可能
  search?: string;       // デフォルト location.search
  paramName?: string;    // デフォルト 'wsa'
  strip?: boolean;       // デフォルト true(成功時のみ消去)
}

                    
このコードブロックをポップアップで表示

トークンは 交換成功後にのみ 消去され、一時的な失敗時にはリロードで再試行できます。失敗時にも即座に消去したい場合は、catch の後に手動で stripHandoffToken()

プル(Pull / M-Auth)

startWorkspaceLogin(options): Promise<WorkspaceLoginRequest>

PKCE を生成し、sessionStorage に保存し、/authorize を構築して(デフォルトで)遷移します。セキュアコンテキスト(HTTPS/localhost)が必要です。

interface StartWorkspaceLoginOptions { authorizeUrl: string; // プラットフォームの /authorize エンドポイント(絶対 URL) clientId: string; // 拡張アプリの app home URL redirectUri: string; // コールバックアドレス、host は clientId と同一ドメインでなければならない state?: string; // デフォルトで 16 バイトのランダム CSRF state を自動生成 workspaceId?: string; // ワークスペースを事前選択し、組織選択ページをスキップ storage?: StorageLike; // デフォルト sessionStorage redirect?: (url: string) => void; // デフォルト location.assign navigate?: boolean; // false = URL を構築するだけで遷移しない(popup/テスト) } interface WorkspaceLoginRequest { url: string; state: string; codeVerifier: string; }
                      
                      interface StartWorkspaceLoginOptions {
  authorizeUrl: string;  // プラットフォームの /authorize エンドポイント(絶対 URL)
  clientId: string;      // 拡張アプリの app home URL
  redirectUri: string;   // コールバックアドレス、host は clientId と同一ドメインでなければならない
  state?: string;        // デフォルトで 16 バイトのランダム CSRF state を自動生成
  workspaceId?: string;  // ワークスペースを事前選択し、組織選択ページをスキップ
  storage?: StorageLike; // デフォルト sessionStorage
  redirect?: (url: string) => void; // デフォルト location.assign
  navigate?: boolean;    // false = URL を構築するだけで遷移しない(popup/テスト)
}
interface WorkspaceLoginRequest { url: string; state: string; codeVerifier: string; }

                    
このコードブロックをポップアップで表示

readAuthorizeCallback(search?, storage?): AuthorizeCallback | null

コールバックランディングページで:code + state を読み、state(CSRF)を検証し、code + 保存済みの codeVerifier を返します。保存されたリクエストを消費しません(消費は交換成功まで遅延)。一時的な失敗時にリロードで再試行できるようにするためです。code がなく error もない場合は null を返します。

interface AuthorizeCallback { code: string; state: string | null; codeVerifier: string; }
                      
                      interface AuthorizeCallback { code: string; state: string | null; codeVerifier: string; }

                    
このコードブロックをポップアップで表示

stripAuthorizeCallback(ctx?): void

現在の URL から code / state を除去します。

completeWorkspaceLogin(options): Promise<WorkspaceIdentity>

use 段階の便利フロー:コールバックを読んで検証 → {code, codeVerifier} をあなたのバックエンドへ POST → 成功後に URL を消去 → ID を返す。

interface CompleteWorkspaceLoginOptions { exchangeUrl: string; // あなた自身のバックエンド交換インターフェース fetch?: typeof fetch; search?: string; // デフォルト location.search storage?: StorageLike; // デフォルト sessionStorage strip?: boolean; // デフォルト true }
                      
                      interface CompleteWorkspaceLoginOptions {
  exchangeUrl: string;   // あなた自身のバックエンド交換インターフェース
  fetch?: typeof fetch;
  search?: string;       // デフォルト location.search
  storage?: StorageLike; // デフォルト sessionStorage
  strip?: boolean;       // デフォルト true
}

                    
このコードブロックをポップアップで表示

WorkspaceLoginError.code の値

code 意味
NoCallback URL に認可コードがない
MissingRequest 保存されたログインリクエストがない/破損している(先に startWorkspaceLogin を呼ぶ)
StateMismatch state の CSRF 検証に通らない
AuthorizeError コールバックが OAuth エラーリダイレクト(?error=...
NoFetch 利用可能な fetch 実装がない
ExchangeFailed 交換インターフェースが非 2xx を返した
InvalidResponse 交換インターフェースが不正な JSON を返した
CryptoUnavailable Web Crypto がない(HTTPS/localhost のセキュアコンテキストが必要)
StorageUnavailable sessionStorage がない(PKCE verifier を保存できない)
InvalidAuthorizeUrl authorizeUrl が絶対 URL でない

三、圧縮ファイルからローカルインストール

unzip workspace-extension-sdk-0.1.0.zip # 2 つのパッケージはビルド済みの dist(main=dist/index.js, types=dist/index.d.ts) npm i ./workspace-extension-sdk/packages/verify # バックエンド npm i ./workspace-extension-sdk/packages/browser # フロントエンド
                      
                      unzip workspace-extension-sdk-0.1.0.zip
# 2 つのパッケージはビルド済みの dist(main=dist/index.js, types=dist/index.d.ts)
npm i ./workspace-extension-sdk/packages/verify   # バックエンド
npm i ./workspace-extension-sdk/packages/browser  # フロントエンド

                    
このコードブロックをポップアップで表示

自分でビルド / テストを実行する場合:

cd workspace-extension-sdk npm install npm run build # tsc → 各パッケージの dist npm test # node --test(外部テスト依存ゼロ、.ts を直接実行するには Node ≥ 22.6 が必要) npm run type-check # tsc --noEmit
                      
                      cd workspace-extension-sdk
npm install
npm run build       # tsc → 各パッケージの dist
npm test            # node --test(外部テスト依存ゼロ、.ts を直接実行するには Node ≥ 22.6 が必要)
npm run type-check  # tsc --noEmit

                    
このコードブロックをポップアップで表示