Autorisation OneDrive et Google Drive
La CLI prend en charge la connexion par navigateur, le stockage local chiffré des comptes, l'état, la déconnexion locale et cloud sync des objets immuables chiffrés via les dossiers d'application OneDrive ou Google Drive. Le renouvellement des jetons est enregistré avant les téléversements suivants. La vérification avec des comptes réels reste à effectuer. Un compte par fournisseur peut être connecté sur chaque appareil ; une nouvelle connexion remplace le compte de ce fournisseur uniquement après la réussite de la nouvelle autorisation.
Avant de vous connecter
Compilez/installez la nouvelle CLI et redémarrez le démon avec la même nouvelle version :
cargo install --path crates/cli --locked
memories daemon
Exécutez le démon dans un terminal distinct. Dans le terminal utilisé pour la connexion, déverrouillez votre bibliothèque existante si nécessaire, puis exécutez memories sudo. Utilisez toujours le même --home/MEMORIES_HOME pour chaque commande. Une nouvelle bibliothèque nécessite d'abord memories init. Ne déplacez pas sa base de données dans un répertoire synchronisé dans le cloud.
Les inscriptions d'applications OAuth ne sont pas fournies. Utilisez vos propres inscriptions ; la CLI ne demande jamais le mot de passe de votre compte Microsoft ou Google. L'authentification et le consentement se déroulent sur le site du fournisseur dans votre navigateur.
Inscription OneDrive
- Dans Microsoft Entra ID, créez une inscription d'application. Choisissez la prise en charge des comptes de tout annuaire organisationnel et des comptes Microsoft personnels si vous avez besoin de OneDrive professionnel et personnel. Ce client utilise le locataire
common. - Sous Authentification, ajoutez une plateforme Applications mobiles et de bureau avec l'URI de redirection
http://localhost/oauth/callback. Il s'agit d'un client de bureau public, et non d'une application Web ou SPA. Ne créez pas de secret client pour ce flux. - Configurez les autorisations déléguées Microsoft Graph
User.ReadetFiles.ReadWrite.AppFolder; la connexion demande égalementoffline_access. La politique de consentement d'une organisation peut nécessiter l'approbation d'un administrateur. - Copiez l'ID d'application (client) et exécutez :
memories sudo
memories cloud login onedrive --client-id YOUR_MICROSOFT_CLIENT_ID
Le rappel utilise http://localhost:PORT/oauth/callback. Microsoft ignore le port lors de la comparaison des URI de redirection localhost ; le chemin doit correspondre à l'inscription. L'écouteur se lie uniquement à l'interface de bouclage IPv4. L'option facultative --port PORT sélectionne un port fixe ; sinon, le système d'exploitation choisit un port libre.
Vous pouvez aussi utiliser --client-config PATH, qui accepte un objet JSON contenant client_id. Les URL personnalisées d'autorisation/de jeton et les secrets de clients confidentiels ne sont pas acceptés.
Inscription Google Drive
- Créez/sélectionnez un projet Google Cloud et activez l'API Google Drive.
- Configurez l'écran de consentement OAuth. Si l'application est en mode Test, ajoutez votre compte Google comme utilisateur de test. Demandez
drive.appdataainsi queopenid,emailetprofilepour identifier le compte. - Créez un client OAuth de type Application de bureau, puis téléchargez son fichier JSON. La CLI attend la section
installedtéléchargée, et non une configuration de client Web. - Conservez le JSON hors de ce dépôt et exécutez :
memories sudo
memories cloud login google-drive --client-config /path/to/google-desktop-client.json
Exemple pour Windows CMD :
memories cloud login google-drive --client-config "%USERPROFILE%\Downloads\google-desktop-client.json"
Le rappel utilise http://127.0.0.1:PORT/oauth/callback. Le flux d'application de bureau prend en charge les rappels de bouclage ; aucun serveur de rappel hébergé n'est nécessaire. Les champs de points de terminaison téléchargés sont ignorés : le client utilise les points de terminaison Google officiels fixes. Le secret du client d'application installée, lorsqu'il est fourni, est lu dans le JSON, jamais dans un argument de commande. Les secrets d'application de bureau ne remplacent pas PKCE.
Google peut faire expirer les jetons de renouvellement des applications en mode Test (couramment après sept jours lorsque des portées non basiques sont demandées). Réautorisez si nécessaire ; les exigences de publication et de vérification par le fournisseur dépendent de votre application.
État, annulation et déconnexion
memories cloud status
memories cloud sync onedrive
memories cloud sync google-drive
memories sudo
memories cloud logout onedrive
memories cloud logout google-drive
L'état renvoie le fournisseur, l'identité du compte, le nom affiché/l'adresse e-mail, l'expiration du jeton d'accès et la présence éventuelle d'un jeton de renouvellement stocké. Il ne renvoie jamais de jetons d'accès, de jetons de renouvellement ni de secrets client. sync_enabled indique qu'au moins un compte cloud est connecté. object_sync ne rapporte que le nombre d'éléments des files de sortie/d'entrée. cloud sync renouvelle les jetons si nécessaire avant les transferts avec le fournisseur ; un jeton d'accès expiré ne signifie pas à lui seul que le consentement du fournisseur a été révoqué.
L'expiration est mesurée prudemment depuis le début de l'échange de jetons ; les réponses réseau lentes et les requêtes de profil du compte ne prolongent pas la validité du jeton.
La déconnexion supprime le compte local et annule toute connexion en attente pour ce fournisseur. Elle ne révoque pas le consentement sur les serveurs Microsoft ou Google. Utilisez les paramètres des applications connectées du fournisseur pour une révocation à distance. La suppression des enregistrements locaux ne garantit pas non plus l'effacement forensique des instantanés de stockage ou des anciennes copies locales.
La connexion est limitée à cinq minutes. --no-browser affiche l'URL d'autorisation sans ouvrir le navigateur, mais attend toujours un rappel sur cet ordinateur. Il ne s'agit pas d'un flux hors bande/à code manuel ni d'un mécanisme de connexion distant/sans interface graphique. En cas d'expiration ou d'erreur normale, la CLI annule son ticket en attente. Après un arrêt forcé de la CLI, attendez l'expiration ou utilisez cloud logout PROVIDER avant de réessayer.
Sécurité et cycle de vie
- OAuth utilise un code d'autorisation avec S256 PKCE et une valeur d'état imprévisible. La méthode de rappel, Host, l'origine, le chemin, les champs en double, l'état, l'expiration et le rejeu sont vérifiés. Les erreurs du fournisseur et les pages de rappel ne reproduisent pas les codes ou jetons.
- L'attente du navigateur, l'échange de jetons et les requêtes d'identité s'exécutent dans le processus CLI, en dehors du mutex du démon et des transactions de base de données. Les requêtes HTTPS limitent les délais et réponses, désactivent les redirections automatiques et n'héritent pas des proxys de l'environnement. Les environnements réseau nécessitant un proxy ne sont pas pris en charge par cette configuration initiale du transport.
- Le démon émet un ticket de courte durée lié au fournisseur, à l'ID client et à l'appelant local. L'enregistrement nécessite à nouveau sudo ; le verrouillage, le redémarrage ou la déconnexion invalident les tickets en attente. Un résultat HTTP tardif ne peut pas rétablir une connexion annulée.
- La CLI locale est considérée comme fiable pour effectuer l'échange avec le fournisseur. L'opération d'écriture de jeton du service exige un ticket valide et une élévation ; ce n'est pas un point de terminaison distant et MCP ne peut pas l'utiliser. Il n'existe pas de commande de lecture de jeton.
- Les comptes et jetons sont contenus dans l'état local chiffré. Ils sont exclus des sauvegardes exportées, de l'approbation des appareils, de la synchronisation des coffres, des sorties d'audit et de MCP. Chaque appareil doit se connecter séparément. La connexion cloud n'accorde pas l'appartenance à un coffre.
- Les tampons de secrets détenus sont remis à zéro ; les bibliothèques HTTP/URL/JSON et la mémoire du système d'exploitation peuvent conserver des copies transitoires, comme décrit dans
SECURITY.md.
Le champ d'état est rétrocompatible lorsqu'il est absent. Ne rouvrez et ne réécrivez pas un stockage autorisé avec un démon plus ancien : il ne comprend pas les comptes cloud et peut supprimer le nouveau champ, ce qui nécessiterait une nouvelle connexion cloud.
Périmètre de validation
Les tests couvrent les échanges des deux fournisseurs avec des jeux de test HTTP locaux, de vrais rappels de bouclage, la persistance chiffrée, la liaison à l'appelant, le rejeu, l'annulation après verrouillage, les portées/jetons de renouvellement manquants, la suppression des données sensibles dans les erreurs, l'exclusion des sauvegardes et le refus de MCP. Le transport de test est privé au module ; les points de terminaison de production sont des URL HTTPS fixes.
L'autorisation d'un compte réel nécessite des ID/configurations de clients inscrits et le consentement de l'utilisateur. Aucun compte de fournisseur réel n'est déclaré vérifié sans ce test. Le mobile utilise le flux d'autorisation natif décrit ci-dessous ; le consentement réel reste non vérifié.
Références vérifiées le 2026-09-09 :
- Flux Microsoft de code d'autorisation
- Dossier d'application OneDrive
- OAuth Google pour applications installées
- Données d'application Google Drive
Client mobile
Le bouton cloud ouvre l'état de connexion, Connecter/Reconnecter, Synchroniser maintenant et Déconnecter. La synchronisation s'exécute uniquement au premier plan. AppAuth ouvre le navigateur système, valide l'état et génère PKCE. Le passage en arrière-plan pour le navigateur verrouille la bibliothèque. Au retour, déverrouillez et autorisez à nouveau localement avant que Rust échange le code. Rust vérifie/stocke les jetons d'accès et de renouvellement et ne les renvoie jamais à Dart.
Compilez avec l'inscription de client public propre à votre plateforme :
--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=...
Des ID client non définis désactivent la connexion avec un message explicatif. N'intégrez pas de secret client Web et ne réutilisez pas la configuration de bouclage de bureau. Utilisez exactement la redirection native prise en charge par le fournisseur pour votre plateforme, bundle/package et identité de signature. Les inscriptions Google iOS utilisent généralement le schéma de l'ID client inversé ; l'inscription Google Android et les restrictions de redirection diffèrent et doivent être vérifiées avec le flux natif pris en charge par ce fournisseur avant de distribuer une version Android. Une URI configurée ne prouve pas à elle seule que le consentement du fournisseur est pris en charge.
Le schéma d'application inscrit par défaut est app.memories.memories. Pour un autre schéma personnalisé, Android accepte la propriété Gradle memoriesOAuthScheme (par exemple via ORG_GRADLE_PROJECT_memoriesOAuthScheme) ; iOS utilise MEMORIES_OAUTH_SCHEME dans mobile/ios/Flutter/Memories.xcconfig. Le schéma doit correspondre à l'inscription du rappel natif et à l'URI de redirection Dart. Lorsque les deux fournisseurs sont activés, inscrivez des rappels compatibles ou ajoutez le second schéma au manifeste natif/aux types d'URL. Les liens d'application/universels HTTPS nécessitent les fichiers d'association de leur plateforme et une configuration native ; ils ne sont pas activés par la compilation par défaut utilisant un schéma personnalisé.
Une connexion par navigateur terminée ne peut pas restaurer une ancienne session d'élévation. L'annulation de la demande de mot de passe local laisse l'autorisation cloud inchangée. Le verrouillage/le passage en arrière-plan annule l'application des résultats tardifs de synchronisation. Les erreurs réseau conservent les données en file d'attente pour une prochaine Synchronisation maintenant ; l'interface distingue une opération terminée d'une exécution limitée ayant encore du travail en attente. La déconnexion supprime les jetons locaux, pas le consentement du fournisseur ni les fichiers cloud. Consultez les conditions de publication pour la validation avec les fournisseurs réels.