laoyang
13a5d08696
v45 API 补录:手机号登录换令牌 + 我的名册 / 家谱接口 + 出口层敏感字段脱敏
🔴 为什么现在才提交(这是「补录」,代码早已上线并验证):
v45 第三/第四批当时,同一工作区里有**并行的鸿蒙端工作流**正在改这个文件
(手机号登录换令牌、media.php 的 ?token=)。按「绝不把别人正在写的裹进
自己的提交」的纪律,那次只提交了自己的 5 个文件,本文件被**故意留下**。
此后文件静止约 25 小时、端上工作流也已收尾 ⇒ 现在补录,让仓库与线上一致
(线上 md5 = 本地 md5,deploy 是从工作树打包的,所以线上一直是这份)。
① `POST /api/v1/login` —— 手机号 + 密码 → API 令牌
原先 App 只能「先去网页签发令牌、再手动粘贴」,能用但没法给别人用。
与网页登录有意不同:不建会话(API 无状态);限流落**文件**
(`sys_get_temp_dir()/fb_login_<sha256(ip|phone)>.json`,60s 窗口 / 5 次)
而不进 $_SESSION;失败**统一**提示(不区分「没这个人」与「密码错」,
否则接口成了手机号是否已注册的探测器);有效期用**服务端时间**算。
成功时顺带 `Calendar::seedDefaults()`(全新安装的兜底)。
② `GET /api/v1/roster` —— 「**我**名册里的人」(我加的 + 别人分享的)
与 `/people`(全家 801 人 = 通讯录底账)区分开:App 名册页要用这个,
否则一屏 800 人且是「别人的通讯录」。组装**照抄 Web 端 index.php 的
people 分支**(同一套类/判据):Person::roster → Kinship::label /
Nickname::display / PersonQuery::phonePlain / PersonQuery::birthdaysOf /
PersonTag::mapFor / Pinyin::initials,外加标签云与标签词表。
⚠️ 复用这些类而非另写,否则会「网页搜得到、App 搜不到」。
③ `GET /api/v1/kin` —— 家谱(以我为中心的关系图)
用 `Kinship::familyMap($fam,$pid,$people,2,2)`,与 Web 端 kin/tree.php
同一套 ⇒ 端上与网页的亲属关系必然一致。按代数排序,拍平直接关系字段。
④ 🔴 信息泄露修复:`stripSensitivePerson()`
`Person::all()` / `Person::roster()` 都是 `SELECT p.*`,把
`phone_hash` / `phone_encrypted` / `id_card_encrypted` / `birthday_id_card` /
`birthday_lunar*` 一路吐给 App。前两个是 AES 密文(离线爆破材料),
`phone_hash` 是「手机号是否属于这个家」的判定键。
⇒ 在 **API 出口层**脱敏(列表 / 详情 / 新建 / PATCH 四个出口都套)。
⚠️ **不能改 `Person::all()` 本身**:网页端确实在用(ContactImporter 靠
phone_hash 去重、PersonQuery 靠 phone_encrypted 按手机号搜)
⇒ 网页要、App 不要 ⇒ 差异落在出口层。
线上验证(全绿):GET login→405 / 缺参→422 / 错密码→401「手机号或密码不对」
/ 不存在的手机号→**同样的** 401 与提示 / 连续错→第 6 次起 429 / 名册 800 人 /
标签云 15 个 / 称谓正确(爸爸→父亲…)/ 手机号解密正确 / 生日阴阳历 /
首字母 ypzbb / 6 个敏感字段全去除(列表与详情都验)。
2026-10-14 09:41:34 +08:00
..
2026-10-14 01:20:40 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 13:24:26 +08:00
2026-10-07 11:35:31 +08:00
2026-10-12 15:31:03 +08:00
2026-10-14 09:41:34 +08:00
2026-10-12 15:31:03 +08:00
2026-10-03 08:18:05 +08:00
2026-10-06 17:33:48 +08:00
2026-10-02 09:28:07 +08:00
2026-10-03 08:18:05 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-10-03 15:01:38 +08:00
2026-10-13 00:29:55 +08:00
2026-10-14 01:20:40 +08:00
2026-10-13 11:53:58 +08:00
2026-10-06 20:41:04 +08:00
2026-10-01 00:12:04 +08:00
2026-10-13 11:53:58 +08:00
2026-10-04 08:56:40 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 00:49:53 +08:00
2026-10-03 20:23:22 +08:00
2026-10-05 13:26:49 +08:00
2026-09-30 00:49:53 +08:00
2026-10-05 16:45:10 +08:00
2026-10-12 15:31:03 +08:00
2026-10-14 01:20:40 +08:00
2026-10-07 05:52:40 +08:00
2026-10-05 10:58:17 +08:00
2026-10-12 21:40:53 +08:00
2026-10-05 10:58:17 +08:00
2026-10-03 08:18:05 +08:00
2026-10-07 15:31:26 +08:00
2026-09-30 09:44:55 +08:00
2026-10-08 02:20:19 +08:00
2026-10-07 18:22:55 +08:00
2026-10-09 20:23:09 +08:00
2026-10-01 00:12:04 +08:00
2026-10-11 10:12:11 +08:00
2026-10-08 02:20:19 +08:00
2026-10-07 05:52:40 +08:00
2026-09-30 13:24:26 +08:00
2026-10-05 16:45:10 +08:00
2026-10-08 10:54:43 +08:00
2026-10-09 07:25:08 +08:00
2026-10-04 08:56:40 +08:00
2026-09-30 13:24:26 +08:00
2026-10-03 19:27:14 +08:00
2026-10-03 19:27:14 +08:00
2026-10-04 08:56:40 +08:00
2026-10-08 02:20:19 +08:00
2026-10-08 02:20:19 +08:00
2026-10-03 11:30:48 +08:00
2026-10-07 11:35:31 +08:00
2026-10-02 22:08:13 +08:00
2026-10-03 11:30:48 +08:00
2026-10-03 15:01:38 +08:00
2026-10-12 16:28:29 +08:00
2026-09-30 00:49:53 +08:00
2026-10-06 03:14:18 +08:00
2026-10-12 15:31:03 +08:00
2026-10-11 10:12:11 +08:00
2026-10-02 09:28:07 +08:00
2026-09-30 11:06:22 +08:00
2026-10-13 11:53:58 +08:00
2026-10-05 16:45:10 +08:00
2026-10-10 22:13:20 +08:00
2026-10-14 01:20:40 +08:00
2026-10-08 10:54:43 +08:00