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 を返します。検証順序:署名 → iss → aud → 期限(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(秒)
}
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 codeVerifier を 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≠0(403209 invalid_grant、403210 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 });
}
};
}
ブラウザパッケージ @gptbots/workspace-extension-sdk
プッシュ(Push handoff)
readHandoffToken(search?, paramName?): string | null
純粋関数。クエリ文字列から生の wsa を読み取ります。search はデフォルト location.search、paramName はデフォルト '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(成功時のみ消去)
}
トークンは 交換成功後にのみ 消去され、一時的な失敗時にはリロードで再試行できます。失敗時にも即座に消去したい場合は、
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; }
readAuthorizeCallback(search?, storage?): AuthorizeCallback | null
コールバックランディングページで:code + state を読み、state(CSRF)を検証し、code + 保存済みの codeVerifier を返します。保存されたリクエストを消費しません(消費は交換成功まで遅延)。一時的な失敗時にリロードで再試行できるようにするためです。code がなく error もない場合は null を返します。
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
}
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 # フロントエンド
自分でビルド / テストを実行する場合:
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
