feat(plugin): Codex 侧改为 OAuth 浏览器登录(v0.2.0)

- .mcp.json 移除 bearer_token_env_var:401 后由 Codex 自动进入 OAuth 2.1 授权流程
  (服务端 https://deta.city 提供 discovery/DCR/PKCE/token/refresh/revoke)
- 安装流程改为 codex plugin add + codex mcp login deta(浏览器里完成账号登录)
- 保留登录助手与 DETA_TOKEN 路径,供 dsh/脚本/CI 使用(README 分节说明)
- 插件版本 0.1.0 -> 0.2.0(市场按版本刷新缓存)
This commit is contained in:
ringo
2026-09-10 11:36:19 +08:00
parent d73e907ec4
commit 4b924674a3
4 changed files with 59 additions and 27 deletions
+17 -6
View File
@@ -16,10 +16,6 @@ DETA 领域能力在各类 Agent harness 上的分发仓:**一份产物,多
## 安装(Codex) ## 安装(Codex)
```bash ```bash
# 先登录(一次性,需要 deta.city 账号):换取 DETA_TOKEN
node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs
source ~/.deta/env # 让 DETA_TOKEN 进入当前 shell 环境
# 从 Git(分发用) # 从 Git(分发用)
codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git
@@ -28,10 +24,25 @@ codex plugin marketplace add ~/Dev/ant/deta-agent-plugins
codex plugin list codex plugin list
codex plugin add deta@deta codex plugin add deta@deta
# 登录(一次性):打开浏览器完成 deta.city 账号登录
codex mcp login deta
``` ```
未登录(环境里没有 `DETA_TOKEN`)时,MCP 端点会返回 **401**——含义是 `codex mcp login deta` 走 OAuth 2.1(授权码 + PKCE S256 + 动态客户端注册):终端给出
「当前环境没有可用的 deta.city 登录态」,重新执行上面的登录两步即可。 `https://deta.city/oauth/authorize?...`,在浏览器里用 deta.city 账号登录并授权即可,
随后 Codex 自行保管令牌并按 refresh token 自动续期。退出登录用 `codex mcp logout deta`。
不支持 OAuth 的宿主(dsh / 脚本 / CI)改用登录助手换取 `DETA_TOKEN`:
```bash
node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs
source ~/.deta/env # 让 DETA_TOKEN 进入当前 shell 环境
```
未登录时 MCP 端点返回 **401**,并带 OAuth 发现提示头
(`WWW-Authenticate: Bearer resource_metadata="https://deta.city/.well-known/oauth-protected-resource/mcp-api/mcp"`)——
标准 MCP 客户端据此自动进入浏览器授权流程,含义是「当前环境没有可用的 deta.city 登录态」。
## 内容 ## 内容
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "deta", "name": "deta",
"version": "0.1.0+codex.20260910023121", "version": "0.2.0",
"description": "DETA \u5efa\u7b51\u6027\u80fd\u8bbe\u8ba1\u63d2\u4ef6\uff1a\u4ee5 AML \u4e3a\u552f\u4e00\u4e8b\u5b9e\u6e90\u7f16\u8f91\u5efa\u7b51\u6a21\u578b\uff0c\u7ecf GSA \u7f16\u8bd1\u4e3a\u5efa\u7b51\u6a21\u578b\u5e76\u505a\u89c4\u5219\u6821\u9a8c\u3002", "description": "DETA \u5efa\u7b51\u6027\u80fd\u8bbe\u8ba1\u63d2\u4ef6\uff1a\u4ee5 AML \u4e3a\u552f\u4e00\u4e8b\u5b9e\u6e90\u7f16\u8f91\u5efa\u7b51\u6a21\u578b\uff0c\u7ecf GSA \u7f16\u8bd1\u4e3a\u5efa\u7b51\u6a21\u578b\u5e76\u505a\u89c4\u5219\u6821\u9a8c\u3002",
"author": { "author": {
"name": "DETA", "name": "DETA",
+1 -2
View File
@@ -2,8 +2,7 @@
"mcpServers": { "mcpServers": {
"deta": { "deta": {
"type": "streamable-http", "type": "streamable-http",
"url": "https://deta.city/mcp-api/mcp", "url": "https://deta.city/mcp-api/mcp"
"bearer_token_env_var": "DETA_TOKEN"
} }
} }
} }
+40 -18
View File
@@ -9,40 +9,62 @@ DETA 领域能力(AML 建筑模型读写、编译校验、围护结构统计
| 项 | 值 | | 项 | 值 |
|----|-----| |----|-----|
| 端点 | `https://deta.city/mcp-api/mcp`(MCP Streamable HTTP) | | 端点 | `https://deta.city/mcp-api/mcp`(MCP Streamable HTTP) |
| 凭据来源 | **deta.city 账号**(令牌经 `POST https://deta.city/prod-api/login` 换取) | | 凭据来源 | **deta.city 账号**;两种取得方式:OAuth 浏览器登录(推荐)或换令牌后手工传 |
| 传参方式 | 环境变量 `DETA_TOKEN`(Codex 侧 `bearer_token_env_var`;dsh 侧 `Authorization: Bearer ${DETA_TOKEN}`) | | Codex 侧 | OAuth 2.1(授权码 + PKCE S256,动态客户端注册),由 `codex mcp login deta` 发起;令牌由 Codex 保管并自动续期,无需手工配置 |
| dsh / 脚本 | 环境变量 `DETA_TOKEN`,作为 `Authorization: Bearer` 或 `X-API-Key` 发送 |
端点除探活接口(服务端 `GET /health`,经 Nginx 前缀对外为 `/mcp-api/health`)外**全部需要鉴权**: 端点除探活接口(服务端 `GET /health`,经 Nginx 前缀对外为 `/mcp-api/health`)外**全部需要鉴权**:
- 请求未带凭据、凭据失效/过期 → **401**(响应体为可读提示,不回显凭据)。 - 无凭据 / 凭据失效 → **401**,且响应带 OAuth 发现提示:
401 的含义是「当前环境没有可用的 deta.city 登录态」,不是工具或模型出错; `WWW-Authenticate: Bearer resource_metadata="https://deta.city/.well-known/oauth-protected-resource/mcp-api/mcp", scope="mcp"`
重新执行 `node bin/deta-login.mjs` 并 `source ~/.deta/env` 即可。 标准 MCP 客户端据此**自动进入浏览器授权流程**(Codex 走的就是这条),无需手工配令牌。
401 的含义是「当前环境没有可用的 deta.city 登录态」,不是工具或模型出错。
- 服务端认证服务不可用(`ANT_ADMIN_SERVER` 未配置或不可达)→ 500,同样不放行。 - 服务端认证服务不可用(`ANT_ADMIN_SERVER` 未配置或不可达)→ 500,同样不放行。
账号的工作区在服务端按账号隔离(`<工作区根>/<账号 ID>`), 账号的工作区在服务端按账号隔离(`<工作区根>/<账号 ID>`),
不同账号的设计源码互不可见;同一账号的新会话继续使用自己的工作区。 不同账号的设计源码互不可见;同一账号的新会话继续使用自己的工作区。
## 安装(Codex) ## 安装与登录(Codex)
```bash ```bash
# 1. 先登录(一次性;需要 deta.city 账号) # 1. 添加市场并安装插件
node ~/Dev/ant/deta-agent-plugins/plugins/deta/bin/deta-login.mjs
# → 写入 ~/.deta/credentials.json 与 ~/.deta/env(均 0600)
# 2. 让 DETA_TOKEN 进入当前 shell 环境
source ~/.deta/env
# 3. 安装插件
codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git codex plugin marketplace add https://git.deta.city/deta/deta-agent-plugins.git
codex plugin add deta@deta codex plugin add deta@deta
# 2. 登录(一次性):浏览器里完成 deta.city 账号登录
codex mcp login deta
``` ```
登录助手选项: `codex mcp login deta` 会打印一条形如
`https://deta.city/oauth/authorize?response_type=code&client_id=…&code_challenge=…` 的地址并打开浏览器;
页面上用 deta.city 账号登录(支持「账号密码」与「邮箱验证码」两个入口),点「登录并授权」后
浏览器提示 `Authentication complete`,终端输出 `Successfully logged in to MCP server 'deta'`。
登录态由 Codex 保存,access token 有效期 1 小时并用 refresh token 自动续期;
换机器或换 `CODEX_HOME` 需重新 `codex mcp login deta`。退出登录:
```bash ```bash
node bin/deta-login.mjs -u <用户名|已验证邮箱|已验证手机号> # 免交互输入标识 codex mcp logout deta # 撤销并删除本地凭据
node bin/deta-login.mjs --email-code <邮箱> # 邮箱验证码登录(未设密码的账号用) ```
node bin/deta-login.mjs --base-url https://<host> # 自建/预发环境
插件默认走 OAuth。若要把令牌固定为环境变量(自动化、容器、CI),装好后改为:
```bash
codex mcp remove deta
codex mcp add deta --url https://deta.city/mcp-api/mcp --bearer-token-env-var DETA_TOKEN
export DETA_TOKEN=<管理端签发的 API Key 或门户登录令牌>
```
### 登录助手(dsh / 脚本 / 预发环境)
OAuth 之外仍保留令牌方式,供不支持 OAuth 的宿主与脚本使用:
```bash
node bin/deta-login.mjs # 交互式:读标识与密码,写 ~/.deta/*
node bin/deta-login.mjs -u <用户名|已验证邮箱|已验证手机号> # 免交互输入标识
node bin/deta-login.mjs --email-code <邮箱> # 邮箱验证码登录(未设密码的账号用)
node bin/deta-login.mjs --base-url https://<host> # 自建/预发环境
source ~/.deta/env # 导出 DETA_TOKEN
``` ```
**标识(identifier)填门户登录页上用的那一个**:用户名、已验证邮箱、已验证手机号,服务端都会解析到同一账号。 **标识(identifier)填门户登录页上用的那一个**:用户名、已验证邮箱、已验证手机号,服务端都会解析到同一账号。