给家里的交易台开一扇只读的门

交易台和 AI agent 需要读投记里的出入金。我只给了它们一个只读、只含出入金、随时能收回的口子。

家里的电脑上跑着一个交易台,还有几个帮我整理数据的 AI agent。它们都需要知道一件事:我往各个平台投了多少钱、取回了多少。这些数据就记在投记里。

最省事的做法是把投记的账号给它们。我没有这么做。

只开一扇门,而且只能往里看

最后做出来的是一个很窄的接口:

  • 只读。 交易台不能往投记里写任何东西。所有录入仍然只在投记里完成,账本只有一个来源,不会出现两边对不上的情况。
  • 只有出入金。 默认只返回入金和出金,带折合人民币的金额和区间汇总。买卖记录要显式加参数才会给。
  • 按账本发令牌。 每个令牌只能读一个账本。令牌只在创建时显示一次,服务器上存的是它的哈希,不是原文;在投记里随时可以撤销。
  • 不追求实时。 交易台不需要秒级刷新,所以接口带限流,每分钟 60 次,足够用,也不怕被误用的脚本拖垮。

还有一个小设计:访问接口的根路径,它会用中文描述自己有哪些端点、接受哪些参数。agent 读一遍就知道怎么调,不需要我另外写说明喂给它。

上线时踩的坑

本地一切正常,部署到服务器后,交易台拿到的却是一个 302——跳转到了登录页。

原因是整个投记站点都挡在统一登录后面,任何请求都要先过浏览器会话的检查。而交易台没有浏览器会话,它只有令牌。

解决办法是只给这一条路径开例外,让它绕过会话检查、改由令牌验证;同时把请求里自带的身份信息全部丢掉,免得有人伪造一个「已登录用户」混进来。例外越窄越好,所以它只覆盖这一个接口。

一个早先决定的回报

投记的云同步没有做端到端加密,服务器能读到账本内容。当初做这个决定时,我把它记成了一项代价。

这次它成了前提:正因为服务器读得懂数据,才能在服务器上算好汇总、按日期筛选,再交给交易台。如果数据在服务器上是一团密文,这扇门就只能开在我自己的浏览器里。