Paramètres de l'Espace de Travail
Paramètres du Thème
Les paramètres de l'espace permettent aux administrateurs d'entreprise de personnaliser la couleur du thème de l'espace de travail afin de l'adapter aux couleurs de leur marque.
Paramètres d'Intégration
GPTBots vous permet d'intégrer l'ensemble de l'espace de travail dans votre application mobile d'entreprise afin que les employés puissent l'ouvrir sans se connecter.
Chiffrement de l'AiToken pour un Employé
- Chiffrez l'e-mail de l'employé avec la clé publique RSA de l'espace de travail (
publicKey) puis encodez le texte chiffré en Base64. - Concaténez votre
projectIdet le texte chiffré en Base64 avec deux-points :{projectId}:{base64-encoded-ciphertext}.
Encodez à nouveau l'ensemble de la chaîne en Base64 ; le résultat est l'AiTokenchiffré final. - Générez l'URL de connexion spécifique à l'employé :
{workspace-integration-url}?{AiToken}. - Lorsque l'employé ouvre cette URL dans l'application mobile, l'espace de travail se lance sans aucune demande de connexion.
- Exemple de code de chiffrement 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";
/**
* Chiffre les données avec la clé publique RSA.
*
* @param data Les données à chiffrer.
* @param publicKeyStr La clé publique RSA encodée en Base64.
* @return Données chiffrées en bytes.
*/
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);
}
/**
* Génère une clé de connexion en chiffrant l'e-mail et en combinant avec le projectId.
*
* @param projectId L'identifiant du projet.
* @param email L'e-mail de l'utilisateur.
* @param publicKey La clé publique RSA encodée en Base64.
* @return La chaîne de clé de connexion finale.
* @throws Exception si le chiffrement échoue.
*/
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 = "votre identifiant de projet";
String email = "votre e-mail";
String publicKey = "votre clé publique";
try {
String key = generateLoginKey(projectId, email, publicKey);
System.out.println(key);
} catch (Exception e) {
System.err.println("Échec de la génération de la clé de connexion : " + e.getMessage());
}
}
}
- Exemple de code de chiffrement TypeScript
import * as forge from 'node-forge';
/**
* Chiffre les données avec la clé publique RSA
* @param data Données à chiffrer
* @param publicKeyStr Chaîne de clé publique encodée en Base64
* @returns Tableau d'octets chiffrés
*/
export function encrypt(data: string, publicKeyStr: string): Uint8Array {
try {
// Décoder la clé publique Base64
const publicKeyBytes = forge.util.decode64(publicKeyStr);
// Créer l'objet clé publique
const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes));
// Utiliser le chiffrement RSA avec padding PKCS1 (comportement par défaut de Java)
const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5');
// Convertir la chaîne d'octets de forge en 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(`Échec du chiffrement RSA : ${error}`);
}
}
/**
* Convertir un tableau d'octets en chaîne Base64
* @param bytes Tableau d'octets
* @returns Chaîne encodée en Base64
*/
export function bytesToBase64(bytes: Uint8Array): string {
// Convertir Uint8Array en chaîne, puis utiliser encode64 de forge
const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
return forge.util.encode64(binaryString);
}
/**
* Convertir une chaîne en Base64
* @param str Chaîne à encoder
* @returns Chaîne encodée en Base64
*/
export function stringToBase64(str: string): string {
return forge.util.encode64(str);
}
/**
* Fonction principale - Générer la chaîne de clé chiffrée
* @param projectId Identifiant du projet
* @param email Adresse e-mail
* @param publicKey Clé publique RSA encodée en Base64
* @returns Chaîne finale encodée en Base64
*/
export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string {
// Utiliser RSA pour chiffrer l'e-mail
const emailRSAEncrypt = encrypt(email, publicKey);
// Convertir le résultat du chiffrement en Base64
const emailRSAStr = bytesToBase64(emailRSAEncrypt);
// Combiner projectId et e-mail chiffré
const keyStr = `${projectId}:${emailRSAStr}`;
// Encoder l'ensemble de la chaîne en Base64
const result = stringToBase64(keyStr);
return result;
}
// Exemple de génération d'AiToken
// generateEncryptedKey(projectId, email, publicKey)
Intégration de l'Espace de Travail dans l'APP
Lorsque les entreprises souhaitent intégrer l'espace de travail dans leur application mobile, elles peuvent assurer la communication entre l'application native et les pages H5 via WebViewBridge. L'intégration peut être réalisée selon les étapes suivantes :
WebViewBridge est une interface de pont pour la communication bidirectionnelle entre les applications natives et les pages H5. Elle fournit des protocoles et méthodes de communication unifiés, permettant une invocation et une transmission de données pratiques entre le code natif et les pages H5.
- Pour des instructions détaillées d'intégration de l'APP, veuillez consulter la Documentation d'Intégration Android de l'Espace de Travail et la Documentation d'Intégration iOS de l'Espace de Travail.
- Lorsque les employés d'entreprise accèdent à l'espace de travail via l'APP, l'espace doit s'ouvrir avec l'identité de l'employé. La règle de génération de l'URL d'accès est la suivante :
https://gptbots.ai/space/h5/home?AiToken={encryptedAiToken}&hideClose=trueOù {encryptedAiToken} est l'AiToken chiffré avec la clé publique RSA, contenant l'ID de l'Organisation et l'e-mail du compte employé.
- Configuration du paramètre hideClose
hideCloseest un paramètre optionnel utilisé pour contrôler l'affichage ou non du bouton "Fermer". Si la valeur esttrue, le bouton "Fermer" sera masqué sur la page webview.- Par défaut, le bouton "Fermer" est affiché sur la page. Cliquer sur le bouton "Fermer" enverra un message de notification d'action de fermeture via WebViewBridge. À la réception de cette notification, l'APP peut fermer la page de l'espace de travail. Les données JSON pour la notification d'action de fermeture sont les suivantes :
{
"eventType": "click",
"data": {
"value": "close",
"timestamp": Date.now(),//Horodatage en millisecondes
"extendedData": {} // Optionnel, paramètres extensibles clé-valeur
}
}
eventType : Chaîne, représente le type d'événement, utilisé pour identifier les différents appels fonctionnels
data : Objet JSON, contient les données de paramètres liées à l'événement, qui peuvent inclure différents champs selon eventType
| Type d'Événement | Constante | Description | Paramètres |
|---|---|---|---|
| click | EVENT_CLICK | Événement de clic sur la page webview | data : Données supplémentaires (optionnel), format JSON, inclut par défaut les champs : value (type d'événement, ex. "click"), timestamp (horodatage en millisecondes) |
| message | EVENT_MESSAGE | Événement de message sur la page webview | data : Données supplémentaires (optionnel), format JSON, inclut par défaut les champs : value (type d'événement, ex. "message"), timestamp (horodatage en millisecondes) |
