Skip to content

Commit 3ec5bac

Browse files
riba2534claude
andcommitted
fix(auth): prefer App Token over User Token for optional commands
resolveOptionalUserToken no longer auto-loads from token.json, ensuring APIs that work with App Token use it by default. Only explicitly provided tokens (--user-access-token flag or FEISHU_USER_ACCESS_TOKEN env var) override to user identity. Search commands (resolveRequiredUserToken) are unaffected and still use the full priority chain. Update skill docs and CLAUDE.md to reflect the new token strategy. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent e33ee2a commit 3ec5bac

4 files changed

Lines changed: 28 additions & 19 deletions

File tree

CLAUDE.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,14 @@ app_secret: "xxx"
109109

110110
**流程**`auth login` → 浏览器授权 → 回调获取 code → 换取 Token → 保存到 `~/.feishu-cli/token.json`
111111

112-
**Token 优先级链**`ResolveUserAccessToken`):
113-
1. `--user-access-token` 命令行参数
114-
2. `FEISHU_USER_ACCESS_TOKEN` 环境变量
115-
3. `~/.feishu-cli/token.json`(access_token 有效直接返回;过期则用 refresh_token 自动刷新)
116-
4. `config.yaml` 中的 `user_access_token` 静态配置
112+
**Token 使用策略**
113+
- **默认使用 App Token**(租户身份):wiki、msg、calendar、task 等 55+ 个命令默认通过 `resolveOptionalUserToken` 使用 App Token,不会自动从 token.json 加载 User Token
114+
- **显式使用 User Token**:通过 `--user-access-token` 参数或 `FEISHU_USER_ACCESS_TOKEN` 环境变量可覆盖为用户身份
115+
- **必须 User Token**:搜索命令(`search docs/messages/apps`)通过 `resolveRequiredUserToken` 走完整优先级链:
116+
1. `--user-access-token` 命令行参数
117+
2. `FEISHU_USER_ACCESS_TOKEN` 环境变量
118+
3. `~/.feishu-cli/token.json`(access_token 有效直接返回;过期则用 refresh_token 自动刷新)
119+
4. `config.yaml` 中的 `user_access_token` 静态配置
117120

118121
**前置条件**:在飞书开放平台 → 应用详情 → 安全设置 → 重定向 URL 中添加 `http://127.0.0.1:9768/callback`
119122

cmd/utils.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@ import (
1313
"github.com/spf13/cobra"
1414
)
1515

16-
// resolveOptionalUserToken 尝试解析 user_access_token(可选)
17-
// 有 token 时使用用户身份,无 token 时回退到应用身份(tenant token)
16+
// resolveOptionalUserToken 解析显式指定的 user_access_token(可选)
17+
// 仅检查 --user-access-token 参数和 FEISHU_USER_ACCESS_TOKEN 环境变量,
18+
// 不自动从 token.json 加载,确保能用 App Token 的 API 默认使用 App Token(租户身份)
1819
func resolveOptionalUserToken(cmd *cobra.Command) string {
19-
flagToken, _ := cmd.Flags().GetString("user-access-token")
20-
cfg := config.Get()
21-
token, err := auth.ResolveUserAccessToken(flagToken, cfg.UserAccessToken, cfg.AppID, cfg.AppSecret, cfg.BaseURL)
22-
if err != nil && cfg.Debug {
23-
fmt.Fprintf(os.Stderr, "[提示] 未找到 User Access Token,将使用应用身份访问。可通过 feishu-cli auth login 获取用户授权\n")
20+
if flagToken, _ := cmd.Flags().GetString("user-access-token"); flagToken != "" {
21+
return flagToken
22+
}
23+
if envToken := os.Getenv("FEISHU_USER_ACCESS_TOKEN"); envToken != "" {
24+
return envToken
2425
}
25-
return token
26+
return ""
2627
}
2728

2829
// resolveRequiredUserToken 解析 user_access_token(必需)

skills/feishu-cli-auth/SKILL.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,13 @@ scope 决定了 Token 能访问哪些 API。登录时通过 `--scopes` 指定(
106106
offline_access search:docs:read search:message search:app wiki:wiki:readonly calendar:calendar:read calendar:calendar.event:read calendar:calendar.event:create calendar:calendar.event:update calendar:calendar.event:reply calendar:calendar.free_busy:read task:task:read task:task:write task:tasklist:read task:tasklist:write im:message:readonly contact:user.base:readonly drive:drive.metadata:readonly
107107
```
108108

109-
### 为什么用最大 scope
109+
### Token 使用策略
110110

111-
feishu-cli 的 wiki、calendar、task、msg 等命令通过 `resolveOptionalUserToken` 支持可选的用户身份。当 token.json 存在时,这些命令会**自动使用 User Access Token**。如果 Token 的 scope 不包含对应权限,API 会返回 99991679 错误(不会回退到应用身份)。一次性授权所有 scope 可以彻底避免此问题。
111+
feishu-cli 的 wiki、calendar、task、msg 等命令通过 `resolveOptionalUserToken` 支持可选的用户身份。这些命令**默认使用 App Token(租户身份)**,不会自动从 token.json 加载 User Token。只有在以下情况才使用 User Token:
112+
- 通过 `--user-access-token` 参数显式传入
113+
- 通过 `FEISHU_USER_ACCESS_TOKEN` 环境变量显式设置
114+
115+
搜索命令(`search docs/messages/apps`)通过 `resolveRequiredUserToken` **必须**使用 User Token,会从 token.json 自动加载。
112116

113117
### Scope 完整说明
114118

@@ -191,7 +195,7 @@ scope 中无目标权限 → 需要重新登录并补充 scope
191195

192196
## Token 自动刷新机制
193197

194-
每次执行需要 User Access Token 的命令时,`ResolveUserAccessToken()` 按以下优先级链查找:
198+
搜索等**必须** User Access Token 的命令(`resolveRequiredUserToken`)通过 `ResolveUserAccessToken()` 按以下优先级链查找。其他可选命令(`resolveOptionalUserToken`)仅检查第 1、2 项,默认使用 App Token
195199

196200
1. `--user-access-token` 命令行参数
197201
2. `FEISHU_USER_ACCESS_TOKEN` 环境变量
@@ -218,7 +222,7 @@ scope 中无目标权限 → 需要重新登录并补充 scope
218222

219223
### 可选 User Access Token 的命令
220224

221-
以下命令通过 `resolveOptionalUserToken` 支持可选的用户身份——有 Token 时用用户身份获取更多结果,无 Token 时回退到应用身份。**但如果 Token 存在而 scope 不足,API 会直接报错而不会回退**
225+
以下命令通过 `resolveOptionalUserToken` 支持可选的用户身份——**默认使用 App Token(租户身份)**,仅在通过 `--user-access-token` 参数或 `FEISHU_USER_ACCESS_TOKEN` 环境变量显式指定时才使用 User Token
222226

223227
| 命令类别 | 需要的 scope |
224228
|---------|-------------|
@@ -240,8 +244,9 @@ feishu-cli auth login --print-url --scopes "offline_access search:docs:read sear
240244
# ... 用户授权 ...
241245
feishu-cli auth callback "<回调URL>" --state "<state>"
242246

243-
# 3. 登录后所有命令自动从 token.json 读取 Token
247+
# 3. 登录后搜索命令自动从 token.json 读取 Token
244248
feishu-cli search docs "产品需求"
249+
# 其他命令默认使用 App Token,需要时可显式传 --user-access-token
245250
feishu-cli wiki export <node_token> -o doc.md
246251
feishu-cli task create --summary "待办事项"
247252
```

skills/feishu-cli-toolkit/references/search-commands.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
3. **命令行参数**`--user-access-token <token>`
1212
4. **环境变量**`FEISHU_USER_ACCESS_TOKEN=<token>`
1313

14-
Token 有效期约 2 小时,Refresh Token 有效期 30 天**始终使用最大 scope 范围登录**,一次性覆盖搜索 + wiki + 日历 + 任务等全部功能。详见 `feishu-cli-auth` 技能。
14+
Token 有效期约 2 小时,Refresh Token 有效期 30 天(需 `offline_access` scope)。搜索命令通过 `resolveRequiredUserToken` 自动从 `token.json` 加载 Token;wiki、日历、任务等命令默认使用 App Token,仅在显式传 `--user-access-token` 时使用用户身份。详见 `feishu-cli-auth` 技能。
1515

1616
## 搜索消息
1717

0 commit comments

Comments
 (0)