logo
Développement
Rechercher
Paramètres de l'Espace de Travail

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 de l'espace de travail

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é

  1. 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.
  2. Concaténez votre projectId et 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'AiToken chiffré final.
  3. Générez l'URL de connexion spécifique à l'employé : {workspace-integration-url}?{AiToken}.
  4. 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()); } } }
                      
                      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());
        }
    }
}

                    
Ce bloc de code dans la fenêtre flottante
  • 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)
                      
                      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)

                    
Ce bloc de code dans la fenêtre flottante

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.

  1. 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.
  2. 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=true

    Où {encryptedAiToken} est l'AiToken chiffré avec la clé publique RSA, contenant l'ID de l'Organisation et l'e-mail du compte employé.

  3. Configuration du paramètre hideClose
  • hideClose est un paramètre optionnel utilisé pour contrôler l'affichage ou non du bouton "Fermer". Si la valeur est true, 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": "click",
  "data": {
    "value": "close",
    "timestamp": Date.now(),//Horodatage en millisecondes
    "extendedData": {}  // Optionnel, paramètres extensibles clé-valeur
  }
}

                    
Ce bloc de code dans la fenêtre flottante

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)