Memories / Documentación

En esta página

Autorización de OneDrive y Google Drive

La CLI permite iniciar sesión en el navegador, almacenar cuentas localmente de forma cifrada, consultar el estado, cerrar sesión localmente y ejecutar cloud sync de objetos de texto cifrado inmutables mediante las carpetas de aplicación de OneDrive o Google Drive. La renovación de tokens se guarda antes de las cargas posteriores. La verificación con cuentas reales sigue pendiente. En cada dispositivo se puede conectar una cuenta por proveedor; volver a iniciar sesión sustituye la cuenta de ese proveedor solo después de que la nueva autorización haya tenido éxito.

Antes de iniciar sesión

Compile/instale la nueva CLI y reinicie el daemon con la misma versión nueva:

cargo install --path crates/cli --locked
memories daemon

Ejecute el daemon en otra terminal. En la terminal donde se iniciará sesión, desbloquee su biblioteca existente si es necesario y ejecute memories sudo. Utilice el mismo --home/MEMORIES_HOME para todos los comandos. Una biblioteca nueva requiere primero memories init. No mueva su base de datos a un directorio sincronizado con la nube.

No se incluyen registros de aplicaciones OAuth. Utilice sus propios registros; la CLI nunca solicita la contraseña de su cuenta de Microsoft o Google. La autenticación y el consentimiento se realizan en el sitio web del proveedor, en su navegador.

Registro de OneDrive

  1. En Microsoft Entra ID, cree un registro de aplicación. Seleccione la compatibilidad con cuentas de cualquier directorio organizativo y cuentas personales de Microsoft si necesita OneDrive empresarial y personal. Este cliente utiliza el inquilino common.
  2. En Autenticación, añada una plataforma de aplicaciones móviles y de escritorio con el URI de redirección http://localhost/oauth/callback. Este es un cliente de escritorio público, no una aplicación Web o SPA. No cree un secreto de cliente para este flujo.
  3. Configure los permisos delegados de Microsoft Graph User.Read y Files.ReadWrite.AppFolder; el inicio de sesión también solicita offline_access. La política de consentimiento de una organización puede requerir la aprobación de un administrador.
  4. Copie el ID de aplicación (cliente) y ejecute:
memories sudo
memories cloud login onedrive --client-id YOUR_MICROSOFT_CLIENT_ID

La devolución de llamada utiliza http://localhost:PORT/oauth/callback. Microsoft ignora el puerto al comparar los URI de redirección de localhost; la ruta debe coincidir con el registro. El receptor escucha únicamente en la interfaz de bucle local IPv4. La opción --port PORT selecciona un puerto fijo; de lo contrario, el sistema operativo elige uno libre.

Como alternativa, --client-config PATH acepta un objeto JSON con client_id. No se aceptan URL de autorización/tokens personalizadas ni secretos de clientes confidenciales.

Registro de Google Drive

  1. Cree/seleccione un proyecto de Google Cloud y habilite la API de Google Drive.
  2. Configure la pantalla de consentimiento OAuth. Si la aplicación está en modo de pruebas, añada su cuenta de Google como usuario de prueba. Solicite drive.appdata junto con openid, email y profile para identificar la cuenta.
  3. Cree un cliente OAuth de tipo aplicación de escritorio y descargue su archivo JSON. La CLI espera la sección installed descargada, no una configuración de cliente Web.
  4. Guarde el JSON fuera de este repositorio y ejecute:
memories sudo
memories cloud login google-drive --client-config /path/to/google-desktop-client.json

Ejemplo para Windows CMD:

memories cloud login google-drive --client-config "%USERPROFILE%\Downloads\google-desktop-client.json"

La devolución de llamada utiliza http://127.0.0.1:PORT/oauth/callback. El flujo de aplicación de escritorio admite devoluciones de llamada de bucle local; no se necesita un servidor de devolución de llamada alojado. Los campos de endpoints descargados se ignoran: el cliente utiliza endpoints oficiales de Google fijos. El secreto del cliente de aplicación instalada, cuando se proporciona, se lee del JSON, nunca de un argumento del comando. Los secretos de aplicaciones de escritorio no sustituyen a PKCE.

Google puede hacer caducar los tokens de renovación de aplicaciones en modo de pruebas (habitualmente después de siete días cuando se solicitan ámbitos no básicos). Vuelva a autorizar cuando sea necesario; los requisitos de publicación y verificación del proveedor dependen de su aplicación.

Estado, cancelación y cierre de sesión

memories cloud status
memories cloud sync onedrive
memories cloud sync google-drive
memories sudo
memories cloud logout onedrive
memories cloud logout google-drive

El estado devuelve el proveedor, la identidad de la cuenta, el nombre visible/correo electrónico, la caducidad del token de acceso y si hay un token de renovación almacenado. Nunca devuelve tokens de acceso, tokens de renovación ni secretos de cliente. sync_enabled indica que al menos una cuenta de nube está conectada. object_sync solo informa de los recuentos de las colas de salida/entrada. cloud sync renueva los tokens cuando es necesario antes de las transferencias con el proveedor; que un token de acceso haya caducado no significa por sí solo que se haya revocado el consentimiento del proveedor. La caducidad se calcula de forma conservadora desde el inicio del intercambio de tokens; las respuestas de red lentas o las consultas del perfil de la cuenta no prolongan la validez del token.

El cierre de sesión elimina la cuenta local y cancela cualquier inicio de sesión pendiente para ese proveedor. No revoca el consentimiento en los servidores de Microsoft o Google. Utilice la configuración de aplicaciones conectadas del proveedor para revocarlo remotamente. Eliminar los registros locales tampoco garantiza su borrado forense de instantáneas de almacenamiento o copias locales anteriores.

El inicio de sesión tiene un límite de cinco minutos. --no-browser muestra la URL de autorización sin abrir el navegador, pero sigue esperando una devolución de llamada en este ordenador. No es un flujo fuera de banda/con código manual ni un mecanismo de inicio de sesión remoto/sin interfaz gráfica. Cuando se agota el tiempo o se produce un error normal, la CLI cancela su ticket pendiente. Tras terminar la CLI por la fuerza, espere a que caduque o utilice cloud logout PROVIDER antes de reintentarlo.

Seguridad y ciclo de vida

  • OAuth utiliza un código de autorización con S256 PKCE y un valor de estado impredecible. Se comprueban el método de devolución de llamada, Host, origen, ruta, campos duplicados, estado, caducidad y reproducción. Los errores del proveedor y las páginas de devolución de llamada no repiten códigos ni tokens.
  • La espera del navegador, el intercambio de tokens y las consultas de identidad se ejecutan en el proceso de la CLI fuera del mutex del daemon y de las transacciones de la base de datos. Las solicitudes HTTPS tienen tiempos de espera y respuestas limitados, deshabilitan las redirecciones automáticas y no heredan proxies del entorno. Esta configuración inicial de transporte no admite entornos de red que requieran un proxy.
  • El daemon emite un ticket de corta duración vinculado al proveedor, al ID de cliente y al solicitante local. Guardar requiere sudo de nuevo; bloquear, reiniciar o cerrar sesión invalida los tickets pendientes. Un resultado HTTP tardío no puede restaurar un inicio de sesión cancelado.
  • Se confía en la CLI local para realizar el intercambio con el proveedor. La operación de escritura de tokens del servicio requiere un ticket válido y elevación; no es un endpoint remoto y MCP no puede utilizarla. No existe un comando de lectura de tokens.
  • Las cuentas y los tokens están dentro del estado local cifrado. Se excluyen de las copias de seguridad exportadas, la aprobación de dispositivos, la sincronización de bóvedas, la salida de auditoría y MCP. Cada dispositivo debe iniciar sesión por separado. Iniciar sesión en la nube no concede pertenencia a una bóveda.
  • Los búferes propios que contienen secretos se sobrescriben con ceros; las bibliotecas HTTP/URL/JSON y la memoria del sistema operativo pueden conservar copias transitorias, como se describe en SECURITY.md.

El campo de estado es compatible con versiones anteriores cuando está ausente. No vuelva a abrir y reescribir un almacén autorizado con un daemon anterior: no comprende las cuentas de nube y puede descartar el nuevo campo, lo que requeriría otro inicio de sesión en la nube.

Alcance de la validación

Las pruebas ejercitan los intercambios de ambos proveedores con fixtures HTTP locales, devoluciones de llamada reales de bucle local, persistencia cifrada, vinculación del solicitante, reproducción, cancelación tras el bloqueo, ámbitos/tokens de renovación ausentes, ocultación de errores, exclusión de copias de seguridad y denegación de MCP. El transporte de prueba es privado del módulo; los endpoints de producción son HTTPS fijos.

La autorización con cuentas reales requiere ID/configuraciones de clientes registrados y consentimiento del usuario. No se afirma que ninguna cuenta real de proveedor esté verificada sin esa prueba. La aplicación móvil utiliza el flujo de autorización nativo descrito a continuación; el consentimiento real sigue sin verificarse.

Referencias consultadas el 2026-09-09:

Cliente móvil

El botón de nube abre el estado de conexión, Conectar/Reconectar, Sincronizar ahora y Desconectar. La sincronización solo funciona en primer plano. AppAuth abre el navegador del sistema, valida el estado y genera PKCE. Pasar al navegador en segundo plano bloquea la biblioteca. Al volver, desbloquee y autorice localmente de nuevo antes de que Rust intercambie el código. Rust verifica/almacena los tokens de acceso y renovación y nunca los devuelve a Dart.

Compile con el registro de cliente público específico de su plataforma:

  • --dart-define=MEMORIES_ONEDRIVE_CLIENT_ID=...
  • --dart-define=MEMORIES_ONEDRIVE_REDIRECT_URI=app.memories.memories:/oauth/callback
  • --dart-define=MEMORIES_GOOGLE_CLIENT_ID=...
  • --dart-define=MEMORIES_GOOGLE_REDIRECT_URI=...

Los ID de cliente sin configurar deshabilitan el inicio de sesión con un mensaje explicativo. No incorpore un secreto de cliente web ni reutilice la configuración de bucle local de escritorio. Utilice la redirección nativa exacta que admita el proveedor para su plataforma, identificador de paquete y firma. Los registros de Google para iOS suelen utilizar el esquema del ID de cliente invertido; el registro de Google para Android y las restricciones de redirección son diferentes y deben verificarse con el flujo nativo admitido por ese proveedor antes de distribuir una compilación de Android. Un URI configurado por sí solo no demuestra que se admita el consentimiento del proveedor.

El esquema de aplicación registrado por defecto es app.memories.memories. Para otro esquema personalizado, Android acepta la propiedad de Gradle memoriesOAuthScheme (por ejemplo, mediante ORG_GRADLE_PROJECT_memoriesOAuthScheme); iOS utiliza MEMORIES_OAUTH_SCHEME en mobile/ios/Flutter/Memories.xcconfig. El esquema debe coincidir con el registro de devolución de llamada nativa y el URI de redirección de Dart. Al habilitar ambos proveedores, registre devoluciones de llamada compatibles o añada el segundo esquema al manifiesto nativo/tipos de URL. Los enlaces de aplicación/universales HTTPS requieren sus archivos de asociación de plataforma y configuración nativa; no están habilitados en la compilación predeterminada con esquema personalizado.

Un inicio de sesión completado en el navegador no puede restaurar una sesión de elevación anterior. Cancelar la solicitud de contraseña local deja la autorización de nube sin cambios. El bloqueo/paso a segundo plano cancela la aplicación de resultados de sincronización tardíos. Los fallos de red conservan los datos en cola para un posterior Sincronizar ahora; la interfaz distingue una operación completada de una ejecución limitada con trabajo pendiente. Cerrar sesión elimina los tokens locales, no el consentimiento del proveedor ni los archivos de nube. Consulte los requisitos de publicación para la validación con proveedores reales.