logo
開發者文件
搜尋
工作空間設定

工作空間設定

主題設定

工作空間設定讓企業管理員可自訂工作空間的主題顏色,以符合品牌形象。
workspace settings

整合設定

GPTBots 支援將整個工作空間嵌入企業行動應用程式,讓員工可無需登入直接開啟。

為員工加密 AiToken

  1. 使用工作空間 RSA 公鑰(RSA Public Key)加密員工電子郵件,並將密文進行 Base64 編碼。
  2. 將您的 projectId 與 Base64 編碼的密文以冒號「:」連接:{projectId}:{base64-encoded-ciphertext},再將整個字串進行 Base64 編碼,結果即為最終加密的 AiToken。
  3. 建立員工專屬登入 URL:{workspace-integration-url}?{AiToken}
  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); } /** * 產生登入密鑰,將 email 加密並與 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("產生登入密鑰失敗:" + 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);
    }

    /**
     * 產生登入密鑰,將 email 加密並與 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("產生登入密鑰失敗:" + 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)); // 使用 RSA 加密與 PKCS1 填充(與 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 加密失敗:${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));

    // 使用 RSA 加密與 PKCS1 填充(與 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 加密失敗:${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 工作空間整合

當企業需要將工作空間整合至行動應用程式時,可透過 WebViewBridge 實現原生應用與 H5 頁面(即 HTML5 頁面)雙向通信。您可以依下列步驟操作:

WebViewBridge 為原生應用與 H5 頁面雙向溝通的橋接介面,提供統一協議與方法,讓原生程式碼與 H5 頁面能方便互調與資料傳遞。

  1. 詳細 APP 整合說明,您可以參考 Android 工作空間整合文件iOS 工作空間整合文件
  2. 企業員工透過 APP 存取工作空間時,應以員工身份開啟。訪問 URL 產生規則如下:
    https://gptbots.ai/space/h5/home?AiToken={encryptedAiToken}&hideClose=true

    其中 {encryptedAiToken} 為使用 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(毫秒)