Configuración del espacio de trabajo
Configuración del tema del espacio de trabajo
La configuración del espacio de trabajo permite a los administradores empresariales personalizar el color del tema para que coincida con los colores de su marca.
Configuración de integración
Se puede incrustar todo el espacio de trabajo en la aplicación móvil empresarial para que los empleados puedan abrirlo sin iniciar sesión.
Cifrado del AiToken para un empleado
- Cifrar el correo electrónico del empleado con la clave pública RSA del espacio de trabajo (
publicKey) y codificar el texto cifrado en Base64. - Concatenar el
projectIdy el texto cifrado en Base64 con dos puntos:{projectId}:{base64-encoded-ciphertext}.
Volver a codificar toda la cadena en Base64; el resultado es elAiTokencifrado final. - Generar la URL de acceso específica del empleado:
{workspace-integration-url}?{AiToken}. - Cuando el empleado abre esta URL dentro de la aplicación móvil, el espacio de trabajo se inicia sin ningún aviso de inicio de sesión.
- Ejemplo de código de cifrado en 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";
/**
* Encrypts data using RSA public key.
*
* @param data The data to encrypt.
* @param publicKeyStr The Base64 encoded RSA public key.
* @return Encrypted data 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);
}
/**
* Generates a login key by encrypting the email and combining with projectId.
*
* @param projectId The project ID.
* @param email The user's email.
* @param publicKey The Base64 encoded RSA public key.
* @return The final login key string.
* @throws Exception if encryption fails.
*/
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());
}
}
}
- Ejemplo de código de cifrado en TypeScript
import * as forge from 'node-forge';
/**
* Encrypt data using RSA public key
* @param data Data to be encrypted
* @param publicKeyStr Base64 encoded public key string
* @returns Encrypted byte array
*/
export function encrypt(data: string, publicKeyStr: string): Uint8Array {
try {
// Decode Base64 public key
const publicKeyBytes = forge.util.decode64(publicKeyStr);
// Create public key object
const publicKey = forge.pki.publicKeyFromAsn1(forge.asn1.fromDer(publicKeyBytes));
// Use RSA encryption with PKCS1 padding (consistent with Java's default behavior)
const encrypted = publicKey.encrypt(data, 'RSAES-PKCS1-V1_5');
// Convert forge's byte string to 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}`);
}
}
/**
* Convert byte array to Base64 string
* @param bytes Byte array
* @returns Base64 encoded string
*/
export function bytesToBase64(bytes: Uint8Array): string {
// Convert Uint8Array to string, then use forge's encode64
const binaryString = Array.from(bytes, byte => String.fromCharCode(byte)).join('');
return forge.util.encode64(binaryString);
}
/**
* Convert string to Base64
* @param str String to be encoded
* @returns Base64 encoded string
*/
export function stringToBase64(str: string): string {
return forge.util.encode64(str);
}
/**
* Main function - Generate encrypted key string
* @param projectId Project ID
* @param email Email address
* @param publicKey Base64 encoded RSA public key
* @returns Final encrypted Base64 string
*/
export function generateEncryptedKey(projectId: string, email: string, publicKey: string): string {
// Use RSA to encrypt email
const emailRSAEncrypt = encrypt(email, publicKey);
// Convert encryption result to Base64
const emailRSAStr = bytesToBase64(emailRSAEncrypt);
// Combine projectId and encrypted email
const keyStr = `${projectId}:${emailRSAStr}`;
// Encode the entire string with Base64
const result = stringToBase64(keyStr);
return result;
}
// Generate AiToken example
// generateEncryptedKey(projectId, email, publicKey)
Integración del espacio de trabajo en la aplicación
Cuando las empresas necesitan integrar el espacio de trabajo en su aplicación móvil, se puede habilitar la comunicación entre la aplicación nativa y las páginas H5 mediante WebViewBridge. La integración se puede implementar según los siguientes pasos:
WebViewBridge es una interfaz puente para la comunicación bidireccional entre aplicaciones nativas y páginas H5. Proporciona protocolos y métodos de comunicación unificados, lo que permite una invocación mutua y una transmisión de datos convenientes entre el código nativo y las páginas H5.
- Para obtener instrucciones detalladas de integración en la aplicación, consúltese Android Workspace Integration Documentation y iOS Workspace Integration Documentation.
- Cuando los empleados de la empresa acceden al espacio de trabajo a través de la aplicación, el espacio de trabajo debe abrirse con la identidad del empleado. La regla de generación de la URL de acceso es la siguiente:
https://gptbots.ai/space/h5/home?AiToken={encryptedAiToken}&hideClose=trueDonde {encryptedAiToken} es el AiToken cifrado con la clave pública RSA, que contiene el ID de la organización y el correo electrónico de la cuenta del empleado.
- Configuración del parámetro
hideClose
hideClosees un parámetro opcional que se utiliza para controlar si se oculta el botón «Close». Si se establece entrue, el botón «Close» se ocultará en la página del WebView.- De forma predeterminada, el botón «Close» se muestra en la página. Al hacer clic en el botón «Close», se enviará un mensaje de notificación de acción de cierre a través de WebViewBridge. Al recibir esta notificación, la aplicación puede cerrar la página del espacio de trabajo. Los datos JSON de la notificación de acción de cierre son los siguientes:
{
"eventType": "click",
"data": {
"value": "close",
"timestamp": Date.now(),//Timestamp in milliseconds
"extendedData": {} // Optional, extensible key-value pair parameters
}
}
eventType: String. Representa el tipo de evento, utilizado para identificar diferentes llamadas funcionales.
data: objeto JSON. Contiene los datos de parámetros relacionados con el evento, que pueden incluir diferentes campos en función de eventType.
| Tipo de evento | Constante | Descripción | Parámetros |
|---|---|---|---|
| click | EVENT_CLICK | Evento de clic de la página Webview | data: Datos adicionales (opcional), en formato JSON; de forma predeterminada incluye los campos: value (valor del evento, p. ej., "close"), timestamp (marca de tiempo en milisegundos) |
| message | EVENT_MESSAGE | Evento de mensaje de la página Webview | data: Datos adicionales (opcional), en formato JSON; de forma predeterminada incluye los campos: value (valor del evento, p. ej., "close"), timestamp (marca de tiempo en milisegundos) |
