Flomo Extension 权限与数据流:storage、tabs、alarms、identity 分别做什么
作者:Flomo Extension · 发布于 · 更新于
安装浏览器扩展时,只看到一组权限名称,很难判断它们与实际功能有什么关系。本文不使用“安全可靠”之类无法由代码单独证明的结论,而是依据 Flomo Extension 1.20.0 源码,把每项权限对应到具体操作,并说明当前实现的边界。
核验结论适用于本文检查的 1.20.0 源码,不等同于对 Chrome 商店安装包的独立安全审计。商店版本、依赖和后续代码都可能变化,安装时仍应以浏览器展示的权限与本站隐私政策为准。
先看结论:每项权限用在哪里
| 权限或页面范围 | 当前源码中的用途 | 什么时候发生 |
|---|---|---|
storage |
保存草稿、flomo 标签页 ID、扩展账户摘要和当日使用记录 | 编辑草稿、连接 flomo 页面、登录扩展账户或完成一次保存时 |
tabs |
查找 v.flomoapp.com 标签页、连接页面脚本、必要时打开或切换到该页面 |
打开扩展、点击“打开 flomo 页面”或后台定时检查时 |
alarms |
设计上用于每 5 分钟检查一次 flomo 标签页 | 安装回调尝试创建任务;1.20.0 存在异步判断缺陷,不能确认任务一定建立 |
identity |
发起 Google OAuth 登录 | 只有用户点击“Google 登录”时 |
*://*/* 内容脚本范围 |
在网页中监听鼠标选中文本,并显示“添加到草稿”入口 | 用户在普通网页完成一次鼠标选择时 |
*://*.flomoapp.com/* 内容脚本范围 |
在 flomo 页面内接收草稿、读取页面标签并操作编辑器 | flomo 页面打开且扩展与该标签页建立连接后 |
这里需要区分两件事:storage、tabs、alarms 和 identity 是扩展清单中的权限;*://*/* 是选中文本内容脚本的页面匹配范围。后者意味着脚本会在普通 HTTP/HTTPS 网页中加载,因此同样值得单独说明。
storage:哪些内容保存在浏览器本地
当前存储封装使用 WXT 的 local: 存储区域。源码中可以确认的本地项目包括:
flomo-draft:编辑器中的 HTML 草稿;flomo-tab-id:当前用于通信的 flomo 标签页 ID;flomo-extension-login-user:扩展账户的邮箱、套餐和到期时间等摘要;flomo-extension-use-record:本地日期与当日保存计数。
草稿会在编辑器内容变化时写入本地存储,关闭弹窗前也会再执行一次保存。收到页面脚本返回的正向保存结果后,扩展会清空草稿并增加当日计数。
当前源码没有为草稿设置自动过期时间,也没有在退出扩展账户时同时删除草稿。浏览器清理扩展数据或卸载扩展后的行为由浏览器管理,本次核验没有将其当作可恢复机制。重要内容不应只依赖扩展草稿保存。
tabs:只看权限名称无法知道查询范围
tabs 权限本身允许扩展使用标签页 API。就本次检查到的功能路径而言,查询使用的是 *://v.flomoapp.com/*:
- 扩展弹窗检查当前窗口是否已打开 flomo 页面;
- 找到页面后,记录标签页 ID;
- 弹窗通过该 ID 与 flomo 页面中的内容脚本建立连接;
- “打开 flomo 页面”按钮会切换到已有页面,或新开
https://v.flomoapp.com。
保存功能需要这条连接,因为扩展不是在后台直接提交 flomo 笔记,而是把内容交给已打开的 flomo 页面处理。当前核验到的查询没有遍历并上传浏览历史,但权限能力不能只靠这句话判断;如果后续版本改变查询逻辑,应重新核对源码和权限说明。
alarms:设计意图与 1.20.0 的实际缺陷
后台代码注册了名为 flomo-alarm 的监听逻辑,设计目标是每 5 分钟维护一次 flomo 标签页。任务如果实际触发,会执行:
- 如果已经存在
v.flomoapp.com标签页,就记录第一个匹配页面的 ID; - 如果没有匹配页面,就新建
https://v.flomoapp.com标签页。
这段处理逻辑的作用是让保存入口更容易连接到 flomo 页面。它不是笔记内容的定时同步任务:当前监听代码没有读取或上传草稿。
但 1.20.0 的安装回调有一个重要实现问题:代码调用异步的 browser.alarms.get() 后没有等待结果,就直接判断返回值。使用 Promise 形式的浏览器 API 时,这个返回值本身是一个 Promise 对象,后续“没有任务就创建”的分支不能按预期执行。因此,仅凭当前源码不能声称周期任务已经成功建立。
更准确的结论是:
- 扩展申请了
alarms权限,并注册了周期任务的处理器; - 源码意图创建 5 分钟周期任务;
- 当前安装路径存在缺陷,实际是否已有任务还可能受旧版本状态或运行环境影响;
- 如果任务存在并触发,页面不存在时可能主动打开 flomo 页面;
- 当前设置页没有找到该行为的显式开关。
这是本次源码核验发现的产品问题,后续版本应等待查询结果后再决定是否创建任务,并为自动打开页面提供用户可控选项。
identity:只在 Google 登录流程中调用
Flomo Extension 有自己的账户体系,用于识别免费或付费套餐;它与用户的 flomo 官方账户不是同一个账户。
当用户点击“Google 登录”时,扩展调用浏览器身份 API 发起 OAuth 流程,请求以下范围:
- Google 账户基本资料;
- Google 账户邮箱地址。
OAuth 回调返回访问令牌后,当前代码会把令牌提交到 Flomo Extension 的 /api/oauth/google/token-login 账户接口,再把接口返回的扩展账户摘要保存在浏览器本地。没有点击 Google 登录时,这条流程不会由普通编辑或选中文本动作触发。
邮箱密码登录是另一条路径:扩展会在本地对输入密码计算 SHA-256 值,再提交登录接口。客户端哈希不应被理解为对整个账户系统安全性的证明;服务端存储、传输与访问控制不在本次前端源码核验范围内。
为什么脚本要在所有网页中运行
普通网页内容脚本匹配 *://*/*。其当前职责很窄:
- 监听网页的
mouseup和mousemove事件; - 鼠标选择结束后,通过
window.getSelection()取得选中的纯文本; - 在选区附近显示“添加到 flomo extension 草稿”;
- 只有用户点击该入口后,才把文本通过扩展内部消息发送到后台;
- 后台把文本追加到浏览器本地草稿。
完成文本选择本身不会写入草稿;必须再点击浮动入口。当前这条代码路径也没有把页面标题或网址自动附在选中文本后面。
不过,“当前实现只处理选区”不等于浏览器授予的页面访问能力很小。全网页匹配范围允许脚本在大量站点运行,密码、支付、企业后台等敏感页面尤其应该谨慎。用户可以在 Chrome 的扩展网站访问设置中限制可访问的网站,但限制后,相应页面的选中文本入口也可能无法工作。
一条笔记实际经过哪些位置
路径一:网页选中文本进入草稿
当前网页的文字选区
→ 普通网页内容脚本读取纯文本
→ 扩展内部消息
→ 后台追加为段落
→ 浏览器本地 flomo-draft
在这一步,源码没有调用 Flomo Extension 的账户接口,也没有直接调用 flomo 的网络接口。
路径二:本地草稿保存到 flomo
浏览器本地草稿
→ 扩展弹窗编辑器
→ 发送给 flomo 页面内容脚本
→ 以 HTML 粘贴事件写入 flomo 网页编辑器
→ 模拟点击 flomo 网页保存按钮
→ 由 flomo 网页完成后续处理
因此,笔记正文最终会进入用户已登录的 flomo 页面,并由 flomo 自己的网页应用处理。Flomo Extension 没有在这条保存路径中读取用户的 flomo 密码;它检查的是 flomo 页面已经存在的登录状态。
路径三:Flomo Extension 账户登录
邮箱与密码哈希,或 Google OAuth 访问令牌
→ Flomo Extension 账户接口
→ 返回邮箱、套餐、到期时间等账户摘要
→ 浏览器本地存储
这条路径与笔记正文路径不同。登录扩展账户不等于登录 flomo,登录 flomo 也不等于已经登录扩展账户。排查保存问题时,需要分别检查两者。
当前实现的明确局限
- 源码检查不能证明 Chrome 商店中的二进制包与仓库代码完全一致;
- 本次没有进行网络抓包、依赖供应链审计或服务端审计;
- 全网页内容脚本的匹配范围较广,当前只读取用户选区是代码现状,不是对未来版本的永久承诺;
- 后台任务如果存在,每 5 分钟可能主动打开 flomo 页面;1.20.0 的任务创建路径本身有缺陷,且当前没有可见开关;
- 保存结果的确认边界有限,详见《Flomo Extension 保存流程与故障排查》。
用户可以怎样降低风险
- 从Chrome 扩展商店页面核对开发者和当前权限;
- 不使用选中文本功能时,在 Chrome 中限制扩展的网站访问范围;
- 不要把密码、密钥、客户资料等敏感文本加入草稿;
- 首次保存使用一条可丢弃的测试笔记,并在 flomo 中确认结果;
- 权限或功能发生变化时,重新阅读安装提示与隐私政策。
核验范围与版本
本文由 Flomo Extension 项目于 2026 年 8 月 1 日依据应用源码核对,目标包版本为 1.20.0。检查范围包括扩展清单、后台任务、普通网页内容脚本、flomo 页面内容脚本、弹窗编辑器、登录接口调用与本地存储封装。本文描述“代码会做什么”,不代替第三方安全测试,也不对 flomo 官方页面的内部实现作推断。