# 安全加固实录（2026-07-29）

## 飞书免登：App Secret 不出前端

### 问题
`feishuAutoLogin()` 在前端调用飞书 API 换 token，App Secret 暴露在页面源码中。

### 修复
切回服务端中转：Tailscale Funnel → Python 服务器 `/api/feishu/auth` → 服务端持 Secret → 返回用户名。

```javascript
var AUTH_URLS = [
  'https://macbook-air-2.tail6864e8.ts.net/api/feishu/auth',
  'http://127.0.0.1:8765/api/feishu/auth'
];
fetch(AUTH_URLS[i], {method:'POST', body: JSON.stringify({code: code})});
```

### 前提
`tailscale funnel --bg http://127.0.0.1:8765` 必须运行。Mac 关机则免登降级为手动登录。

## 登录暴力破解防护

### 实现
`localStorage` 记录登录失败次数，按邮箱+小时聚合，满 5 次锁定：

```javascript
var attempts = JSON.parse(localStorage.getItem('bior_login_attempts') || '{}');
var key = email + '_' + new Date().toISOString().slice(0,13);
if (attempts[key] >= 5) {
  errEl.textContent = '登录尝试次数过多，请15分钟后再试';
  return;
}
// 失败时 +1
attempts[key] = (attempts[key] || 0) + 1;
// 成功时清除
delete attempts[key];
```

## CloudBase user_roles 权限收紧

### 修复前
`{"read": "auth != null", "write": "auth != null"}` → 任何匿名用户可读写全表

### 修复后
`{"read": true, "write": "auth.openid == doc._openid"}` → 仅创建者可写自己记录

### 配置路径
CloudBase 控制台 → 数据库 → user_roles → 权限设置 → 自定义安全规则

## 关联技能
- `baoyu-password-management` → 密码管理全流程
- `baoyu-workbench-ops` → Tailscale Funnel 运维
