logo
Development
検索
ワークスペース設定

ワークスペース設定

テーマ設定

スペース設定では、企業管理者がワークスペースのテーマカラーを企業ブランドに合わせてカスタマイズできます。
workspace settings

統合設定

GPTBotsでは、ワークスペース全体を企業のモバイルアプリに組み込み、企業ユーザーがログインなしでワークスペースを利用できるよう実装することで、社員の利便性を向上させます。

企業従業員として AiToken を暗号化する

  1. 開発者はワークスペースの RSA 公開鍵(publicKey) を使って メンバーアカウントのメールアドレス(email) を暗号化し、結果を Base64 エンコードします。
  2. 自身の プロジェクト ID(projectId)暗号化済みメールアドレス をコロンで連結し、形式は {projectId}:{暗号化後のメールアドレスのbase64} とします。連結した文字列をさらに Base64 エンコードして、最終的な暗号化 AiToken を得ます。
  3. {ワークスペース統合URL}?{AiToken} の形式に従い、従業員アカウント専用のログイン URL を生成します。
  4. 企業従業員はモバイルアプリ内で当該従業員アカウントメールアドレス専用の暗号化ログイン URL を開くことで、対応するワークスペースを ログインなしで 利用できます。
  • Java による暗号化コード例
import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import javax.crypto.Cipher; public class Main { private static final String RSA_ALGORITHM = "RSA"; private static final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding"; /** * RSA 公開鍵でデータを暗号化します。 * * @param data 暗号化するデータ * @param publicKeyStr Base64 でエンコードされた RSA 公開鍵 * @return 暗号化されたデータのバイト配列 */ public static byte[] encrypt(byte[] data, String publicKeyStr) throws Exception { byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM); PublicKey publicKey = keyFactory.generatePublic(keySpec); Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * メールアドレスを暗号化し、projectId と組み合わせてログインキーを生成します。 * * @param projectId プロジェクト ID * @param email ユーザーのメールアドレス * @param publicKey Base64 でエンコードされた RSA 公開鍵 * @return 最終的なログインキー文字列 * @throws Exception 暗号化失敗時 */ public static String generateLoginKey(String projectId, String email, String publicKey) throws Exception { byte[] emailEncrypted = encrypt(email.getBytes(StandardCharsets.UTF_8), publicKey); String emailRSAStr = Base64.getEncoder().encodeToString(emailEncrypted); String keyStr = projectId + ":" + emailRSAStr; return Base64.getEncoder().encodeToString(keyStr.getBytes(StandardCharsets.UTF_8)); } public static void main(String[] args) { String projectId = "your project ID"; String email = "your email"; String publicKey = "your public key"; try { String key = generateLoginKey(projectId, email, publicKey); System.out.println(key); } catch (Exception e) { System.err.println("Failed to generate login key: " + e.getMessage()); } } }
                      
                      import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

public class Main {

  private static final String RSA_ALGORITHM = "RSA";
  private static final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding";

  /**
   * RSA 公開鍵でデータを暗号化します。
   *
   * @param data         暗号化するデータ
   * @param publicKeyStr Base64 でエンコードされた RSA 公開鍵
   * @return 暗号化されたデータのバイト配列
   */
  public static byte[] encrypt(byte[] data, String publicKeyStr) throws Exception {
    byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
    PublicKey publicKey = keyFactory.generatePublic(keySpec);

    Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION);
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    return cipher.doFinal(data);
  }

  /**
   * メールアドレスを暗号化し、projectId と組み合わせてログインキーを生成します。
   *
   * @param projectId プロジェクト ID
   * @param email     ユーザーのメールアドレス
   * @param publicKey Base64 でエンコードされた RSA 公開鍵
   * @return 最終的なログインキー文字列
   * @throws Exception 暗号化失敗時
   */
  public static String generateLoginKey(String projectId, String email, String publicKey) throws Exception {
    byte[] emailEncrypted = encrypt(email.getBytes(StandardCharsets.UTF_8), publicKey);
    String emailRSAStr = Base64.getEncoder().encodeToString(emailEncrypted);
    String keyStr = projectId + ":" + emailRSAStr;
    return Base64.getEncoder().encodeToString(keyStr.getBytes(StandardCharsets.UTF_8));
  }

  public static void main(String[] args) {
    String projectId = "your project ID";
    String email = "your email";
    String publicKey = "your public key";

    try {
      String key = generateLoginKey(projectId, email, publicKey);
      System.out.println(key);
    } catch (Exception e) {
      System.err.println("Failed to generate login key: " + e.getMessage());
    }
  }
}

                    
このコードブロックをポップアップで表示
  • TypeScript による暗号化コード例
import * as forge from 'node-forge'; /** * RSA 公開鍵でデータを暗号化します * @param data 暗号化するデータ * @param publicKeyStr Base64 でエンコードされた公開鍵文字列 * @returns 暗号化されたバイト配列 */ export function encrypt(data: string, publicKeyStr: string): Uint8Array { try { // Base64 公開鍵をデコード const publicKeyBytes = forge.util.decode64(publicKeyStr); // 公開鍵オブジェクトを生成 const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes)); // PKCS1 パディングで RSA 暗号化(Java のデフォルト動作と一致) const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5'); // forge のバイト文字列を Uint8Array に変換 const bytes = new Uint8Array(encrypted.length); for (let i = 0; i < encrypted.length; i++) { bytes[i] = encrypted.charCodeAt(i) & 0xff; } return bytes; } catch (error) { throw new Error(`RSA encryption failed: ${error}`); } } /** * バイト配列を Base64 文字列に変換 * @param bytes バイト配列 * @returns Base64 文字列 */ export function bytesToBase64(bytes: Uint8Array): string { const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join(''); return forge.util.encode64(binaryString); } /** * 文字列を Base64 へ変換 * @param str 変換する文字列 * @returns Base64 文字列 */ export function stringToBase64(str: string): string { return forge.util.encode64(str); } /** * 暗号化キー文字列を生成するメイン関数 * @param projectId プロジェクト ID * @param email メールアドレス * @param publicKey Base64 でエンコードされた RSA 公開鍵 * @returns 最終的な暗号化 Base64 文字列 */ export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string { const emailRSAEncrypt = encrypt(email, publicKey); const emailRSAStr = bytesToBase64(emailRSAEncrypt); const keyStr = `${projectId}:${emailRSAStr}`; const result = stringToBase64(keyStr); return result; } // AiToken 生成例 // generateEncryptedKey(projectId, email, publicKey)
                      
                      import * as forge from 'node-forge';

/**
 * RSA 公開鍵でデータを暗号化します
 * @param data 暗号化するデータ
 * @param publicKeyStr Base64 でエンコードされた公開鍵文字列
 * @returns 暗号化されたバイト配列
 */
export function encrypt(data: string, publicKeyStr: string): Uint8Array {
  try {
  // Base64 公開鍵をデコード
  const publicKeyBytes = forge.util.decode64(publicKeyStr);

  // 公開鍵オブジェクトを生成
  const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes));

  // PKCS1 パディングで RSA 暗号化(Java のデフォルト動作と一致)
  const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5');

  // forge のバイト文字列を Uint8Array に変換
  const bytes = new Uint8Array(encrypted.length);
  for (let i = 0; i < encrypted.length; i++) {
    bytes[i] = encrypted.charCodeAt(i) & 0xff;
  }
  return bytes;
  } catch (error) {
  throw new Error(`RSA encryption failed: ${error}`);
  }
}

/**
 * バイト配列を Base64 文字列に変換
 * @param bytes バイト配列
 * @returns Base64 文字列
 */
export function bytesToBase64(bytes: Uint8Array): string {
  const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
  return forge.util.encode64(binaryString);
}

/**
 * 文字列を Base64 へ変換
 * @param str 変換する文字列
 * @returns Base64 文字列
 */
export function stringToBase64(str: string): string {
  return forge.util.encode64(str);
}

/**
 * 暗号化キー文字列を生成するメイン関数
 * @param projectId プロジェクト ID
 * @param email メールアドレス
 * @param publicKey Base64 でエンコードされた RSA 公開鍵
 * @returns 最終的な暗号化 Base64 文字列
 */
export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string {
  const emailRSAEncrypt = encrypt(email, publicKey);
  const emailRSAStr = bytesToBase64(emailRSAEncrypt);
  const keyStr = `${projectId}:${emailRSAStr}`;
  const result = stringToBase64(keyStr);
  return result;
}

// AiToken 生成例
// generateEncryptedKey(projectId, email, publicKey)

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

APP でのワークスペース統合

企業が APP にワークスペースを統合する場合、WebViewBridge を利用して APP と H5 ページ間の通信を行うことができます。以下の手順で統合を進めてください。

WebViewBridge は、ネイティブアプリと H5 ページ間で双方向通信を可能にするブリッジインターフェースです。統一された通信プロトコルとメソッドを提供し、ネイティブコードと H5 ページが相互に呼び出しやデータの受け渡しを簡単に行えます。

  1. APP 統合の詳細は、Android 端ワークスペース統合説明ドキュメントおよび iOS 端ワークスペース統合説明ドキュメント を参照してください。
  2. 企業従業員が APP からワークスペースにアクセスする際は、従業員の身分でワークスペースアドレスを開く必要があります。アクセス URL の生成ルールは以下の通りです:
    https://gptbots.ai/space/h5/home?AiToken={暗号化AiToken}&hideClose=true

    {暗号化AiToken} は RSA 公開鍵で暗号化された AiToken であり、組織ID従業員アカウントメールアドレスを含みます。

  3. hideClose パラメータの設定
  • hideClose はオプションパラメータで、「閉じる」ボタンの表示・非表示を制御します。true に設定すると、webview ページ内で「閉じる」ボタンが非表示になります。
  • デフォルトではページに「閉じる」ボタンが表示され、クリックすると WebViewBridge を通じて閉じるアクションのメッセージ通知が送信されます。APP はこのメッセージ通知を受信後、ワークスペースページを閉じることができます。閉じるアクションメッセージ通知の JSON データ例は以下の通りです:
{ "eventType": "click", "data": { "value": "close", "timestamp": Date.Now(), // タイムスタンプ(ミリ秒) "extendedData": {} // 任意項目、拡張可能なキー・バリュー型パラメータ } }
                      
                      {
  "eventType": "click",
  "data": {
  "value": "close",
    "timestamp": Date.Now(), // タイムスタンプ(ミリ秒)
    "extendedData": {}  // 任意項目、拡張可能なキー・バリュー型パラメータ
  }
}

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

eventType:文字列。イベントタイプを示し、異なる機能呼び出しの識別に使用します
data:JSON オブジェクト。イベント関連のパラメータデータを含み、eventType に応じて異なるフィールドを持ちます

イベントタイプ 定数 説明 パラメータ
click EVENT_CLICK webview ページのクリックイベント data: 追加データ(任意)、JSON 形式。デフォルトで含まれるフィールド:
value(イベントタイプ例:"click")、
timestamp(タイムスタンプ:ミリ秒単位)
message EVENT_MESSAGE webview ページのメッセージイベント data: 追加データ(任意)、JSON 形式。デフォルトで含まれるフィールド:
value(イベントタイプ例:"message")、
timestamp(タイムスタンプ:ミリ秒単位)