クイックスタート
最小限のコードで、完全な「ID ハンドシェイク」を一通り動かしてみましょう。ワークスペースユーザーがあなたの組織拡張アプリを開いたときに ID 情報を受け渡し、開発者の拡張アプリのバックエンドが現在のユーザー ID を正しく識別し、ユーザーの ID 情報を取得できるようにします。
- Workspace-Extension-SDK の GitHub アドレスは次のとおりです: https://github.com/GPTBOTS/Workspace-Extension-SDK
- プルログインについては 04-プルログイン を参照してください。
以下のクイックチュートリアルでは、プッシュ(Push) モードを使って簡単に説明します:
事前準備:シークレットの取得
まず、組織拡張アプリの HS256 署名シークレット を取得する必要があります。これは組織拡張アプリの ID ハンドシェイクを完了するために使用します。
- ワークスペースの OWNER/ADMIN に ワークスペース → スペース管理 → 拡張アプリ へ進んでもらい、「追加」をクリックします
- アプリ名、アプリアイコン、アプリ入口 URL(
app_home_url) - 認証モードは workspace_account(ID の受け渡しが必要)を選びます
- 送信後、システムが
App Secretを平文で一度だけ表示 します。すぐにコピーして保存してください——閉じると二度と確認できず、ローテーションするしかありません。
シークレットは
wext_+ 64 桁の 16 進数(Tier 2)のような形式です。バックエンドにのみ保存(環境変数 / シークレット管理サービス)し、フロントエンド、git、ログには絶対に書き込まないでください。
ステップ 1:バックエンド —— トークンを検証するインターフェース
新しいバックエンドインターフェースを作成し、フロントエンドから POST された wsa を受け取り、シークレットで検証し、成功したら自前のセッションを確立します。
// Node / Express の例
import express from 'express';
import { verifyWsa, WsaVerificationError } from '@gptbots/workspace-extension-verify';
const app = express();
app.use(express.json());
app.post('/session/exchange', (req, res) => {
try {
const identity = verifyWsa(req.body.wsa, {
secret: process.env.EXTENSION_APP_SECRET, // あなたのシークレット(バックエンドのみ)
audience: 'app.example.com', // あなたのアプリの host。トークンの aud と一致する必要がある
});
// identity = { accountId, role, workspaceId, username?, email?, avatar?, appName?, issuedAt?, expiresAt? }
const sid = createYourSession(identity); // 自前の session に置き換える
res.cookie('sid', sid, { httpOnly: true, secure: true, sameSite: 'lax' });
res.json(identity);
} catch (e) {
const code = e instanceof WsaVerificationError ? e.code : 'Error';
res.status(401).json({ code }); // 検証失敗は一律拒否
}
});
verifyWsaは 順番に 検証します:署名 →iss→aud→exp(iat/nbfを含む)→ 必須クレーム。いずれかに通らなければWsaVerificationErrorをスローします。詳細は 06-SDK APIリファレンス を参照してください。
ステップ 2:フロントエンド —— ランディングページでトークンを消費する
ユーザーはプラットフォームによって app_home_url?wsa=<JWT> へ導かれます。このランディングページ上で、wsa を読み取り、自前のバックエンドへ POST し、その後 URL から消去 します。
// あなたのランディングページ
import { consumeHandoff } from '@gptbots/workspace-extension-sdk';
const identity = await consumeHandoff({ exchangeUrl: '/session/exchange' });
// consumeHandoff は順に次を行います:
// 1) 現在の URL の ?wsa= を読み取る
// 2) { wsa } を /session/exchange に POST する(あなたのバックエンドがここで verifyWsa する)
// 3) 成功後、history.replaceState で URL 内の ?wsa= を消去する
// 4) あなたのバックエンドが返した identity を返す
console.log('現在のワークスペースユーザー:', identity.username, identity.role);
if (identity.role === 'MEMBER') hideAdminUI();
これで、2 つのコードだけで安全な ID ハンドシェイクが完了します。
全体フローの一枚図
ワークスペース「拡張」ページ GPTBots プラットフォーム あなたのアプリ
──────────────── ─────────── ────────
ユーザーがアプリアイコンをクリック ─────────▶ クリックした人がそのワークスペースのメンバーか検証
シークレットで 5 分間有効な wsa (JWT) に署名
https://app.example.com/?wsa=<JWT> を開く ───────────────────────────▶ ランディングページ
consumeHandoff()
◀── POST /session/exchange { wsa } ──
あなたのバックエンドが verifyWsa() → identity
自前の session を確立
URL 内の ?wsa= を消去
ローカル結合テストのヒント
wsaの 有効期限はわずか 5 分 で、使い捨ての誘導トークンです——自前のセッションに置き換えたら、以降のリクエストではwsaを 付けないで ください。audienceは登録した host(app.example.com)と厳密に一致する必要があります。ポート/プロトコルはaudに含まれませんが、host は一致していなければならず、そうでなければWrongAudienceになります。- 検証失敗はまず
WsaVerificationError.code(InvalidSignature/Expired/WrongAudience…)を確認し、07-トラブルシューティング と照らし合わせてください。 - セッションを作らず、表示用に ID を読むだけにしたいですか?
consumeHandoffをreadHandoffToken()に置き換えるだけです(02 の消費 3 段階 を参照)。
次のステップ:02-コアコンセプト を読んでトークンの契約と 2 つのモードを理解するか、直接 03-プッシュ連携 / 04-プルログイン で完全な詳細を確認してください。
自前の Web システムを「拡張アプリ」として GPTBots ワークスペースに接続します。ワークスペースユーザーが ワークスペース → 拡張 (Extensions) からあなたのアプリを開くと、GPTBots はユーザーの ワークスペース ID を短期署名トークン(wsa、1 つの JWT)として安全にあなたへ引き継ぎます。あなたのアプリはこれをもとにログイン不要でユーザーを識別し、ロールに応じて機能を開放できます。
目次ナビゲーション
| ファイル | 読者 | 内容 |
|---|---|---|
| クイックスタート.md | すべての人 | 10 分で完全な ID ハンドシェイクを一通り動かす(最小限で使えるフロントエンド + バックエンドコードを含む) |
| コアコンセプト.md | すべての人 | 2 層の拡張アプリ、2 つの統合モード、auth_mode、消費 3 段階、wsa トークン契約 |
| プッシュ連携.md | プッシュ接続側 | ユーザーが拡張ページでアプリを開く → プラットフォームが wsa をあなたへプッシュ(?wsa= ランディングページ) |
| プルログイン.md | プル接続側 | あなたのアプリに「Login with GPTBots Workspace」ボタンを設置(OAuth2 認可コード + PKCE) |
| トークン検証とセキュリティ.md | すべての人(必読) | 必須検証チェックリスト、シークレット保管、SDK を使わない場合の多言語検証(Java / Node / Python) |
| SDK APIリファレンス.md | すべての人 | 2 つの SDK パッケージの完全な API、型、エラーコード |
| トラブルシューティング.md | すべての人 | FAQ、エラーコード一覧表、よくある落とし穴 |
SDK 一覧
公式 SDK は フレームワーク非依存・ランタイム依存ゼロ の 2 つのパッケージです(どちらも圧縮ファイル workspace-extension-sdk-0.1.0.zip に含まれています):
| パッケージ名 | 実行場所 | 役割 |
|---|---|---|
@gptbots/workspace-extension-verify |
あなたの バックエンド(Node) | シークレットで wsa を検証 → WorkspaceIdentity を取得;バックエンドで code → wsa に交換 |
@gptbots/workspace-extension-sdk |
ブラウザ | wsa の読み取り / 消去 / 交換;「Login with GPTBots Workspace」の開始 |
SDK を使いたくない場合でも問題ありません——
wsaは標準的な HS256 JWT なので、どの言語の JWT ライブラリでも検証できます。05-トークン検証とセキュリティ を参照してください。
圧縮ファイルからローカルインストール
# 解凍後、2 つのパッケージにはビルド済みの dist が同梱されており、そのままローカル依存として使えます:
unzip workspace-extension-sdk-0.1.0.zip
npm i ./workspace-extension-sdk/packages/verify # バックエンド
npm i ./workspace-extension-sdk/packages/browser # フロントエンド
SDK が npm に公開された後は、直接
npm i @gptbots/workspace-extension-verify/npm i @gptbots/workspace-extension-sdkを実行できます。
接続前のすり合わせチェックリスト
- 組織拡張アプリを作成済みで、対応するシークレットを取得済みであることを確認した
- 統合モードを決定した:プッシュ または プル(M-Auth)
-
app_home_url(プッシュ)/redirect_uriの host(プル)が登録情報と完全に一致している - バックエンドで
wsa検証を実装済み:署名 +iss+aud+expの 4 項目を 必須 で検証 - ランディング直後にすぐ
history.replaceStateで URL 内のwsa/codeを消去する - トークンをアプリ自前のセッションに置き換え、以降のリクエストで
wsaを透過的に渡さない - アプリサーバーの時計を NTP 同期済み
