ワークスペース設定
ワークスペース設定
テーマ設定
スペース設定では、企業管理者がワークスペースのテーマカラーを企業ブランドに合わせてカスタマイズできます。
統合設定
GPTBotsでは、ワークスペース全体を企業のモバイルアプリに組み込み、企業ユーザーがログインなしでワークスペースを利用できるよう実装することで、社員の利便性を向上させます。
企業従業員として AiToken を暗号化する
- 開発者はワークスペースの
RSA 公開鍵(publicKey)を使ってメンバーアカウントのメールアドレス(email)を暗号化し、結果を Base64 エンコードします。 - 自身の
プロジェクト ID(projectId)と暗号化済みメールアドレスをコロンで連結し、形式は{projectId}:{暗号化後のメールアドレスのbase64}とします。連結した文字列をさらに Base64 エンコードして、最終的な暗号化AiTokenを得ます。 {ワークスペース統合URL}?{AiToken}の形式に従い、従業員アカウント専用のログイン URL を生成します。- 企業従業員はモバイルアプリ内で当該従業員アカウントメールアドレス専用の暗号化ログイン 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 ページが相互に呼び出しやデータの受け渡しを簡単に行えます。
- APP 統合の詳細は、Android 端ワークスペース統合説明ドキュメントおよび iOS 端ワークスペース統合説明ドキュメント を参照してください。
- 企業従業員が APP からワークスペースにアクセスする際は、従業員の身分でワークスペースアドレスを開く必要があります。アクセス URL の生成ルールは以下の通りです:
https://gptbots.ai/space/h5/home?AiToken={暗号化AiToken}&hideClose=true{暗号化AiToken} は RSA 公開鍵で暗号化された AiToken であり、組織IDと従業員アカウントメールアドレスを含みます。
- 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(タイムスタンプ:ミリ秒単位) |
