Workspace-Einstellungen
Theme-Einstellungen
Mit den Space-Einstellungen können Administrator:innen von Unternehmen die Farbauswahl des Workspace-Designs individuell an die Markenfarben ihres Unternehmens anpassen.
Integrationseinstellungen
GPTBots ermöglicht es, den gesamten Workspace in die mobile Unternehmens-App einzubetten, sodass Mitarbeitende ihn ohne Anmeldung öffnen können.
Verschlüsselung des AiToken für Mitarbeitende
- Verschlüsseln Sie die E-Mail-Adresse des Mitarbeitenden mit dem RSA-öffentlichen Schlüssel (
publicKey) des Workspaces und kodieren Sie den verschlüsselten Text in Base64. - Verbinden Sie Ihre
projectIdund den Base64-codierten verschlüsselten Text mit einem Doppelpunkt:{projectId}:{base64-encoded-ciphertext}.
Kodieren Sie die gesamte Zeichenkette erneut in Base64; das Ergebnis ist das endgültig verschlüsselteAiToken. - Erstellen Sie die mitarbeiterspezifische Login-URL:
{workspace-integration-url}?{AiToken}. - Öffnet der Mitarbeitende diese URL innerhalb der mobilen App, startet der Workspace ohne Login-Aufforderung.
- JAVA-Verschlüsselungsbeispiel
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";
/**
* Verschlüsselt Daten mit dem RSA-öffentlichen Schlüssel.
*
* @param data Zu verschlüsselnde Daten.
* @param publicKeyStr Der Base64-codierte RSA-öffentliche Schlüssel.
* @return Verschlüsselte Datenbytes.
*/
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);
}
/**
* Generiert einen Login-Schlüssel, indem die E-Mail verschlüsselt und mit der projectId kombiniert wird.
*
* @param projectId Die Projekt-ID.
* @param email Die E-Mail-Adresse des Nutzenden.
* @param publicKey Der Base64-codierte RSA-öffentliche Schlüssel.
* @return Die finale Login-Schlüssel-Zeichenkette.
* @throws Exception bei Verschlüsselungsfehlern.
*/
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 = "Ihre Projekt-ID";
String email = "Ihre E-Mail-Adresse";
String publicKey = "Ihr öffentlicher Schlüssel";
try {
String key = generateLoginKey(projectId, email, publicKey);
System.out.println(key);
} catch (Exception e) {
System.err.println("Fehler beim Generieren des Login-Schlüssels: " + e.getMessage());
}
}
}
- TypeScript-Verschlüsselungsbeispiel
import * as forge from 'node-forge';
/**
* Daten mit RSA-öffentlichem Schlüssel verschlüsseln
* @param data Zu verschlüsselnde Daten
* @param publicKeyStr Base64-codierter öffentlicher Schlüssel
* @returns Verschlüsseltes Byte-Array
*/
export function encrypt(data: string, publicKeyStr: string): Uint8Array {
try {
// Base64-codierten öffentlichen Schlüssel dekodieren
const publicKeyBytes = forge.util.decode64(publicKeyStr);
// Öffentlichen Schlüssel-Objekt erstellen
const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes));
// RSA-Verschlüsselung mit PKCS1-Padding (entspricht dem Standardverhalten von Java)
const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5');
// Byte-String von forge in Uint8Array umwandeln
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-Verschlüsselung fehlgeschlagen: ${error}`);
}
}
/**
* Byte-Array in Base64-Zeichenkette umwandeln
* @param bytes Byte-Array
* @returns Base64-codierte Zeichenkette
*/
export function bytesToBase64(bytes: Uint8Array): string {
// Uint8Array in String umwandeln, dann mit forge encode64 kodieren
const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
return forge.util.encode64(binaryString);
}
/**
* String in Base64 umwandeln
* @param str Zu kodierender String
* @returns Base64-codierte Zeichenkette
*/
export function stringToBase64(str: string): string {
return forge.util.encode64(str);
}
/**
* Hauptfunktion – Verschlüsselten Schlüsselstring generieren
* @param projectId Projekt-ID
* @param email E-Mail-Adresse
* @param publicKey Base64-codierter RSA-öffentlicher Schlüssel
* @returns Final verschlüsselte Base64-Zeichenkette
*/
export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string {
// E-Mail per RSA verschlüsseln
const emailRSAEncrypt = encrypt(email, publicKey);
// Verschlüsselungsergebnis in Base64 umwandeln
const emailRSAStr = bytesToBase64(emailRSAEncrypt);
// projectId und verschlüsselte E-Mail kombinieren
const keyStr = `${projectId}:${emailRSAStr}`;
// Gesamte Zeichenkette mit Base64 kodieren
const result = stringToBase64(keyStr);
return result;
}
// AiToken-Beispiel generieren
// generateEncryptedKey(projectId, email, publicKey)
Workspace-Integration in der mobilen App
Wenn Unternehmen den Workspace in ihre mobile App integrieren möchten, kann die Kommunikation zwischen der nativen App und H5-Seiten (Webseiten) über die WebViewBridge erfolgen. Die Integration kann nach folgenden Schritten umgesetzt werden:
Die WebViewBridge ist eine Brückenschnittstelle für die bidirektionale Kommunikation zwischen nativen Anwendungen und H5-Seiten (Webseiten). Sie stellt einheitliche Kommunikationsprotokolle und Methoden bereit, die einfache gegenseitige Aufrufe und eine reibungslose Datenübertragung zwischen nativen Codes und H5-Seiten ermöglichen.
- Ausführliche Anweisungen zur App-Integration finden Sie in der Android Workspace-Integrationsdokumentation und der iOS Workspace-Integrationsdokumentation.
- Wenn Mitarbeitende über die App auf den Workspace zugreifen, sollte dieser mit der Identität der jeweiligen Person geöffnet werden. Die Regel zur Generierung der Zugriffs-URL lautet:
https://gptbots.ai/space/h5/home?AiToken={encryptedAiToken}&hideClose=trueDabei ist {encryptedAiToken} das mit dem RSA-öffentlichen Schlüssel verschlüsselte AiToken, das die Organisations-ID und die E-Mail-Adresse des Mitarbeitenden enthält.
- Konfiguration des hideClose-Parameters
hideCloseist ein optionaler Parameter, mit dem gesteuert wird, ob die Schaltfläche „Schließen“ ausgeblendet wird. Ist er auftruegesetzt, wird die Schaltfläche „Schließen“ auf der Webview-Seite ausgeblendet.- Standardmäßig wird die Schaltfläche „Schließen“ auf der Seite angezeigt. Beim Klick auf die Schaltfläche wird über die WebViewBridge eine Benachrichtigung zum Schließen gesendet. Nach Empfang dieser Benachrichtigung kann die App die Workspace-Seite schließen. Die JSON-Daten für die Benachrichtigung sehen wie folgt aus:
{
"eventType": "click",
"data": {
"value": "close",
"timestamp": Date.now(), // Zeitstempel in Millisekunden
"extendedData": {} // Optional, erweiterbare Schlüssel-Wert-Paare
}
}
eventType: String, gibt den Ereignistyp an und dient zur Identifikation verschiedener Funktionsaufrufe
data: JSON-Objekt, enthält ereignisbezogene Parameterdaten, die je nach eventType unterschiedliche Felder enthalten können
| Event Type | Konstante | Beschreibung | Parameter |
|---|---|---|---|
| click | EVENT_CLICK | Klick-Ereignis auf der Webview-Seite | data: Zusätzliche Daten (optional), JSON-Format, enthält standardmäßig: value (Ereignistyp, z. B. „click“), timestamp (Zeitstempel in Millisekunden) |
| message | EVENT_MESSAGE | Nachrichtenereignis auf der Webview-Seite | data: Zusätzliche Daten (optional), JSON-Format, enthält standardmäßig: value (Ereignistyp, z. B. „message“), timestamp (Zeitstempel in Millisekunden) |
Tipp: Für eine erfolgreiche Workspace-Integration in Ihre mobile App empfiehlt es sich, die Begriffe „Workspace-Integration“, „AiToken“, „RSA-Verschlüsselung“ und „mobile App“ gezielt in Ihrer internen Dokumentation und Kommunikation zu verwenden, um die Auffindbarkeit und das Verständnis zu verbessern.
