dreygur/opencode-qwen-oauth
GitHub: dreygur/opencode-qwen-oauth
为 OpenCode 提供 Qwen.ai 的 OAuth 设备流程认证插件,支持 PKCE 安全验证、自动 token 刷新和请求限流。
Stars: 0 | Forks: 0
# opencode-qwen-oauth
[](https://www.npmjs.com/package/opencode-qwen-oauth)
[](https://www.npmjs.com/package/opencode-qwen-oauth)
[](LICENSE)
[](https://github.com/dreygur/opencode-qwen-oauth/actions)
[](CONTRIBUTING.md)
[](https://www.typescriptlang.org/)
[](https://opencode.ai)
[](https://qwen.ai)
[OpenCode](https://opencode.ai) 的 Qwen OAuth 认证插件 - 使用 OAuth device flow (PKCE) 与 Qwen.ai 进行认证。
## 功能特性
- 🔐 **OAuth Device Flow** - 基于 PKCE 安全认证,适用于无头/CI 环境
- 🔄 **自动刷新 Token** - 在过期前自动刷新 Token
- 💾 **持久化凭据** - Token 保存至 `~/.qwen/oauth_creds.json`,跨会话持久化
- 🌐 **自动打开浏览器** - 自动打开浏览器进行认证
- 🚀 **简易安装** - 使用 CLI 工具一键安装
- 🎯 **自定义 Headers** - 自动为 API 请求添加 Qwen 特定的 headers (X-DashScope-*)
- ⚙️ **优化参数** - 为 Qwen 模型预配置 temperature 和 topP 设置
- 🌍 **环境变量** - 将 Qwen 凭据暴露给 shell 环境
- ⏱️ **请求限流** - 内置速率限制,避免 429 错误
- 🏗️ **清晰架构** - 分层设计(services, repositories, middleware),易于维护
## 快速开始
### 安装
```
# 使用 npx (推荐)
npx opencode-qwen-oauth install
# 或使用 bunx
bunx opencode-qwen-oauth install
# 或手动安装
npm install opencode-qwen-oauth
```
安装程序将会:
- 将 `opencode-qwen-oauth` 添加到您的 `.opencode/opencode.json` 插件中
- 配置 Qwen provider 及模型
### 认证
```
# 启动 OpenCode
opencode
# 连接到 Qwen
/connect
```
选择 **"Qwen Code (qwen.ai OAuth)"** 并按照设备流程说明操作。
### 使用 Qwen 模型
```
/model qwen/coder-model
```
## 模型
| Model | Context | Output | Features |
|-------|---------|--------|----------|
| `coder-model` | 1M tokens | 64K | 针对编码优化 |
| `vision-model` | 128K tokens | 32K | 视觉 + 语言 |
## 配置
### 调试模式
启用详细日志:
```
QWEN_OAUTH_DEBUG=true opencode
```
日志输出到 OpenCode 的日志系统,可在 OpenCode 界面中查看。
### 手动配置
如果您更喜欢手动设置,请添加到 `.opencode/opencode.json`:
```
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-qwen-oauth"],
"provider": {
"qwen": {
"npm": "@ai-sdk/openai-compatible",
"name": "Qwen Code",
"options": {
"baseURL": "https://portal.qwen.ai/v1"
},
"models": {
"coder-model": {
"id": "coder-model",
"name": "Qwen Coder",
"limit": { "context": 1048576, "output": 65536 },
"modalities": { "input": ["text"], "output": ["text"] }
},
"vision-model": {
"id": "vision-model",
"name": "Qwen Vision",
"limit": { "context": 131072, "output": 32768 },
"modalities": { "input": ["text", "image"], "output": ["text"] },
"attachment": true
}
}
}
}
}
```
## CLI 命令
```
# 安装 (默认)
npx opencode-qwen-oauth install
# 卸载
npx opencode-qwen-oauth uninstall
# 帮助
npx opencode-qwen-oauth --help
```
## 诊断
验证 Qwen OAuth 端点是否可访问:
```
curl -I https://chat.qwen.ai/api/v1/oauth2/device/code
```
如果端点可用,应返回 `200 OK`。
## 故障排除
### "设备码已过期"
在启动 `/connect` 后的 15 分钟内完成浏览器登录。
### "invalid_grant" 错误
您的 refresh token 已过期。运行 `/connect` 重新认证。
### "Quota exceeded" 错误
您的免费层限额已用尽。请等待配额重置或在此升级您的账户:https://chat.qwen.ai
### Provider 未在 /connect 中显示
直接使用 CLI:
```
opencode auth login qwen
```
### 浏览器未自动打开 (Linux)
插件会尝试多种方法打开您的浏览器:
1. 首先尝试 `xdg-open` (标准 Linux)
2. 回退尝试:`google-chrome`, `firefox`, `chromium`, `brave-browser`, `microsoft-edge`
如果都不起作用,请手动复制终端中显示的 URL 并在浏览器中打开。
要确保浏览器打开功能正常,请安装 `xdg-utils`:
```
# Ubuntu/Debian
sudo apt install xdg-utils
# Fedora/RHEL
sudo dnf install xdg-utils
# Arch Linux
sudo pacman -S xdg-utils
```
### Credentials File
凭据保存至 `~/.qwen/oauth_creds.json`(与 qwen-code CLI 兼容):
```
~/.qwen/oauth_creds.json
```
这允许在 OpenCode 插件和 qwen-code CLI 之间共享认证。
### 检查日志
OpenCode 日志可以通过 OpenCode 界面查看,或通过检查 OpenCode 日志目录查看。
## 工作原理
此插件实现了带有 PKCE 的 OAuth 2.0 Device Flow (RFC 8628):
1. **Device Code Request** - 插件向 Qwen OAuth 服务器请求设备代码
2. **User Authorization** - 用户访问验证 URL 并输入用户代码
3. **Token Polling** - 插件轮询 access token,直到用户授权
4. **Token Storage** - Token 存储在 OpenCode 的认证系统中
5. **Auto Refresh** - Access token 在过期前自动刷新
## 安全性与重要说明
### 安全特性
- ✅ 使用 PKCE (RFC 7636) 增强安全性
- ✅ 无需 client secret(对公共客户端更安全)
- ✅ Token 存储在 OpenCode 的认证系统和 `~/.qwen/oauth_creds.json` 中以确保持久性
- ✅ 所有 OAuth 活动均记录以供审计
- ✅ 日志中的敏感数据已脱敏
### 实现说明
⚠️ **重要**:此插件使用的 OAuth 端点似乎是 Qwen 网页界面 (`chat.qwen.ai`) 的一部分。虽然实现遵循标准 OAuth 2.0 规范(RFC 8628 Device Flow + RFC 7636 PKCE),但这些端点并未在 Qwen 的公开 API 文档中正式记录。
**这意味着:**
- OAuth 流程正常工作并遵循行业标准
- 端点得到积极维护且功能正常
- Qwen 认证系统的未来变化可能需要插件更新
**已验证可用:**
- ✅ OAuth Device Flow: `https://chat.qwen.ai/api/v1/oauth2/*`
- ✅ API Endpoint: `https://portal.qwen.ai/v1/chat/completions`
- ✅ Token Refresh: 自动刷新
- ✅ OpenAI-Compatible: 使用标准 OpenAI API 格式
随时运行 `npm run diagnose` 以验证端点可用性。
## 开发
```
# 克隆并安装
git clone https://github.com/dreygur/opencode-qwen-oauth.git
cd opencode-qwen-oauth
npm install
# 构建
npm run build
# Watch mode
npm run dev
# 运行测试
npm test
# 本地测试
npm link
cd /path/to/project
npx opencode-qwen-oauth install
```
### 测试
所有测试使用 Node.js 原生测试运行器和 tsx:
```
npm test
```
29 项测试覆盖:
- PKCE 密钥对生成
- 输入验证(URL、token、code)
- 数据脱敏
## 插件架构
此插件使用清晰、分层的架构实现了多个 OpenCode 插件钩子:
### 已实现的 Hooks
#### `auth` Hook
提供 OAuth 设备流程认证,支持自动打开浏览器和 token 轮询。使用 `TokenService` 进行 token 管理,使用 `CredentialRepository` 进行持久化。
#### `config` Hook
向 OpenCode 动态注册 Qwen provider 和可用模型。
#### `event` Hook
监控会话事件以进行调试。
#### `chat.headers` Hook
为 Qwen API 请求注入自定义 headers:
- `User-Agent: QwenCode/0.10.3 (platform)`
- `X-DashScope-CacheControl: enable`
- `X-DashScope-UserAgent: QwenCode/0.10.3 (platform)`
- `X-DashScope-AuthType: qwen-oauth`
#### `chat.params` Hook
优化 Qwen 的模型参数:
- Temperature: `0.7` (默认)
- Top P: `0.95` (默认)
#### `shell.env` Hook
将环境变量暴露给 shell 命令:
- `QWEN_API_BASE_URL` - Qwen API endpoint
- `QWEN_PROVIDER` - Provider 标识符
## 架构
此插件采用**分层架构**以提高可维护性:
```
src/
├── index.ts # Plugin entry point (190 lines)
├── types.ts # Shared type definitions
├── strategies/
│ └── oauth.strategy.ts # OAuth Device Flow (RFC 8628)
├── services/
│ └── token.service.ts # Token management & caching
├── repositories/
│ └── credential.repository.ts # File-based credential storage
├── middleware/
│ ├── auth.middleware.ts # Auth fetch interceptor
│ ├── rate-limit.middleware.ts # Request throttling
│ └── retry.middleware.ts # Retry with exponential backoff
├── utils/
│ ├── logger.ts # Structured logging
│ ├── mutex.ts # Concurrency control
│ └── pkce.ts # PKCE key generation
└── [config, validation, etc.]
```
**总计:** ~1,670 行(从 2,810 行重构而来,-41%)
**注意:** `.opencode/` 目录仅用于本地测试,不包含在 npm 包中。
## 许可证
MIT
## 相关链接
- [OpenCode Documentation](https://opencode.ai/docs)
- [OpenCode Plugin API](https://opencode.ai/docs/plugins)
- [Qwen.ai](https://chat.qwen.ai)
标签:API 安全, DNS解析, Headless 认证, MITM代理, Modbus, OAuth 2.0, OpenCode 插件, PKCE, Qwen.ai, TypeScript, 代码分析, 令牌刷新, 凭证管理, 大模型工具, 安全插件, 开源项目, 自动化攻击, 设备授权流程, 通义千问, 集成开发环境