OneDrive 和 Google Drive 授权
CLI 支持浏览器登录、加密本地账户存储、状态、本地退出登录,以及通过 OneDrive 或 Google Drive 应用文件夹执行不可变密文对象的 cloud sync。令牌刷新会在后续上传之前持久化。真实账户验证仍待完成。每台设备对每个提供方可以连接一个账户;再次登录只有在新授权成功后才会替换该提供方的账户。
登录之前
构建/安装新版 CLI,并使用相同的新版本重启守护进程:
cargo install --path crates/cli --locked
memories daemon
在单独的终端中运行守护进程。在执行登录的终端中,按需解锁现有库,然后运行 memories sudo。每条命令始终使用相同的 --home/MEMORIES_HOME。新库需要先运行 memories init。不要将其数据库移入云同步目录。
软件不附带 OAuth 应用注册。请使用自己的注册;CLI 绝不会询问 Microsoft 或 Google 账户密码。认证和同意在浏览器中的提供方网站上完成。
OneDrive 注册
- 在 Microsoft Entra ID 中创建应用注册。如果同时需要企业和个人 OneDrive,选择支持任何组织目录中的账户以及个人 Microsoft 账户。此客户端使用
common租户。 - 在认证设置下添加移动和桌面应用程序平台,重定向 URI 为
http://localhost/oauth/callback。这是公共桌面客户端,不是 Web 或 SPA 应用。不要为此流程创建客户端秘密。 - 配置委托的 Microsoft Graph 权限
User.Read和Files.ReadWrite.AppFolder;登录还会请求offline_access。组织的同意策略可能要求管理员批准。 - 复制应用程序(客户端)ID 并运行:
memories sudo
memories cloud login onedrive --client-id YOUR_MICROSOFT_CLIENT_ID
回调使用 http://localhost:PORT/oauth/callback。Microsoft 在匹配 localhost 重定向 URI 时忽略端口;路径必须与注册匹配。监听器仅绑定 IPv4 回环。可选的 --port PORT 选择固定端口;否则由 OS 选择空闲端口。
也可以使用 --client-config PATH,它接受包含 client_id 的 JSON 对象。不接受自定义授权/令牌 URL 或机密客户端秘密。
Google Drive 注册
- 创建/选择 Google Cloud 项目,并启用 Google Drive API。
- 配置 OAuth 同意屏幕。如果应用处于测试模式,将 Google 账户添加为测试用户。请求
drive.appdata,以及用于账户识别的openid、email和profile。 - 创建类型为桌面应用的 OAuth 客户端,然后下载其 JSON 文件。CLI 需要下载文件中的
installed部分,不是 Web 客户端配置。 - 将 JSON 保存在此仓库之外并运行:
memories sudo
memories cloud login google-drive --client-config /path/to/google-desktop-client.json
Windows CMD 示例:
memories cloud login google-drive --client-config "%USERPROFILE%\Downloads\google-desktop-client.json"
回调使用 http://127.0.0.1:PORT/oauth/callback。桌面应用流程支持回环回调;不需要托管回调服务器。下载文件中的端点字段会被忽略:客户端使用固定的 Google 官方端点。如果提供了已安装应用的客户端秘密,它从 JSON 读取,绝不通过命令参数传入。桌面应用秘密不能替代 PKCE。
Google 可能使测试模式应用的刷新令牌过期(请求非基础范围时通常为七天)。需要时重新授权;发布和提供方验证要求取决于应用。
状态、取消与退出登录
memories cloud status
memories cloud sync onedrive
memories cloud sync google-drive
memories sudo
memories cloud logout onedrive
memories cloud logout google-drive
状态返回提供方、账户身份、显示名称/电子邮件、访问令牌过期时间,以及是否存储了刷新令牌。它绝不返回访问令牌、刷新令牌或客户端秘密。sync_enabled 表示至少连接了一个云账户。object_sync 只报告 outbox/inbox 数量。cloud sync 在提供方传输之前按需刷新令牌;仅访问令牌过期并不意味着提供方同意已被撤销。过期时间从令牌交换开始保守计算;缓慢网络响应或账户资料查询不会延长令牌有效期。
退出登录删除本地账户,并取消该提供方的任何待处理登录。它不会撤销 Microsoft 或 Google 服务器上的同意。请使用提供方的已连接应用设置进行远程撤销。删除本地记录也不保证从存储快照或较旧本地副本中实现取证意义上的擦除。
登录有五分钟限制。--no-browser 打印授权 URL 而不打开浏览器,但仍等待本机回调。这不是带外/手动验证码流程,也不是远程/无界面登录机制。超时或普通错误时,CLI 取消其待处理票据。强制终止 CLI 后,请等待过期,或在重试之前使用 cloud logout PROVIDER。
安全与生命周期
- OAuth 使用带 S256 PKCE 的授权码和不可预测的 state 值。回调方法、Host、来源、路径、重复字段、state、过期和重放均会检查。提供方错误和回调页面不回显授权码或令牌。
- 浏览器等待、令牌交换和身份查询在 CLI 进程中运行,不占用守护进程互斥锁或数据库事务。HTTPS 请求限制超时/响应,禁用自动重定向,并且不继承环境代理。此初始传输配置不支持需要代理的网络环境。
- 守护进程发出绑定提供方、客户端 ID 和本地调用方的短期票据。保存时需要再次 sudo;锁定、重启或退出登录会使待处理票据失效。迟到的 HTTP 结果不能恢复已取消的登录。
- 本地 CLI 被信任来执行提供方交换。服务的令牌写入操作要求有效票据和提权;它不是远程端点,也不能被 MCP 使用。没有令牌读取命令。
- 账户和令牌位于加密本地状态内。它们从导出备份、设备审批、保险库同步、审计输出和 MCP 中排除。每台设备必须分别登录。云登录不会授予保险库成员资格。
- 拥有的秘密缓冲区会被清零;HTTP/URL/JSON 库和 OS 内存可能保留临时副本,详见
SECURITY.md。
状态字段缺失时保持向后兼容。不要使用旧版守护进程重新打开并重写已授权存储:它不理解云账户,可能丢弃新字段,导致需要再次云登录。
验证范围
测试针对本地 HTTP 测试夹具执行两种提供方交换,覆盖真实回环回调、加密持久化、调用方绑定、重放、锁定后取消、缺失范围/刷新令牌、错误脱敏、备份排除和 MCP 拒绝。测试传输是模块私有的;生产端点是固定 HTTPS。
真实账户授权需要注册的客户端 ID/配置和用户同意。未经该测试,不会声称已验证真实提供方账户。移动端使用下文描述的原生授权流程;真实同意仍未验证。
参考资料核查日期为 2026-09-09:
移动客户端
云按钮打开连接状态、连接/重新连接、立即同步和断开连接。同步仅在前台进行。AppAuth 打开系统浏览器、验证 state 并生成 PKCE。浏览器进入后台会锁定库。返回后,先解锁并再次进行本地授权,再由 Rust 交换授权码。访问和刷新令牌由 Rust 验证/存储,绝不返回 Dart。
使用平台对应的公共客户端注册构建:
--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=...
未设置客户端 ID 会禁用登录并显示说明。不要嵌入 Web 客户端秘密或复用桌面回环配置。使用提供方针对平台、bundle/package 和签名身份支持的精确原生重定向。Google iOS 注册通常使用反转客户端 ID 的 scheme;Google Android 注册和重定向限制不同,分发 Android 构建之前必须通过该提供方支持的原生流程验证。仅配置 URI 不能证明支持提供方同意。
默认注册的应用 scheme 为 app.memories.memories。对于其他自定义 scheme,Android 接受 Gradle 属性 memoriesOAuthScheme(例如通过 ORG_GRADLE_PROJECT_memoriesOAuthScheme);iOS 使用 MEMORIES_OAUTH_SCHEME,位于 mobile/ios/Flutter/Memories.xcconfig 中。scheme 必须与原生回调注册和 Dart 重定向 URI 匹配。启用两个提供方时,请注册兼容回调,或将第二个 scheme 添加到原生 manifest/URL 类型。HTTPS 应用/通用链接需要平台关联文件和原生配置;默认自定义 scheme 构建不会启用它们。
完成浏览器登录不能恢复旧的提权会话。取消本地密码提示不会改变云授权。锁定/进入后台会取消迟到同步结果的应用。网络故障保留队列数据,以便稍后立即同步;UI 区分已完成操作与仍有待处理工作的有界运行。退出登录删除本地令牌,不删除提供方同意或云文件。真实提供方验证参见发布门槛。