logo
Development
検索
クイックスタート

クイックスタート

最小限のコードで、完全な「ID ハンドシェイク」を一通り動かしてみましょう。ワークスペースユーザーがあなたの組織拡張アプリを開いたときに ID 情報を受け渡し、開発者の拡張アプリのバックエンドが現在のユーザー ID を正しく識別し、ユーザーの ID 情報を取得できるようにします。

以下のクイックチュートリアルでは、プッシュ(Push) モードを使って簡単に説明します:

事前準備:シークレットの取得

まず、組織拡張アプリの HS256 署名シークレット を取得する必要があります。これは組織拡張アプリの ID ハンドシェイクを完了するために使用します。

  • ワークスペースの OWNER/ADMIN に ワークスペース → スペース管理 → 拡張アプリ へ進んでもらい、「追加」をクリックします
  • アプリ名、アプリアイコン、アプリ入口 URLapp_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 }); // 検証失敗は一律拒否 } });
                      
                      // 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順番に 検証します:署名 → issaudexpiat/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();
                      
                      // あなたのランディングページ
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= を消去
                      
                      ワークスペース「拡張」ページ                 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.codeInvalidSignature / Expired / WrongAudience …)を確認し、07-トラブルシューティング と照らし合わせてください。
  • セッションを作らず、表示用に ID を読むだけにしたいですか? consumeHandoffreadHandoffToken() に置き換えるだけです(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 を取得;バックエンドで codewsa に交換
@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 # フロントエンド
                      
                      # 解凍後、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 同期済み