dreygur/opencode-qwen-oauth

GitHub: dreygur/opencode-qwen-oauth

为 OpenCode 提供 Qwen.ai 的 OAuth 设备流程认证插件,支持 PKCE 安全验证、自动 token 刷新和请求限流。

Stars: 0 | Forks: 0

# opencode-qwen-oauth [![npm version](https://img.shields.io/npm/v/opencode-qwen-oauth.svg?style=flat-square)](https://www.npmjs.com/package/opencode-qwen-oauth) [![npm downloads](https://img.shields.io/npm/dm/opencode-qwen-oauth.svg?style=flat-square)](https://www.npmjs.com/package/opencode-qwen-oauth) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE) [![CI Status](https://img.shields.io/github/actions/workflow/status/dreygur/opencode-qwen-oauth/ci.yml?branch=main&style=flat-square&label=CI)](https://github.com/dreygur/opencode-qwen-oauth/actions) [![Contributing](https://img.shields.io/badge/contributions-welcome-brightgreen?style=flat-square)](CONTRIBUTING.md) [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org/) [![OpenCode](https://img.shields.io/badge/OpenCode-Plugin-purple?style=flat-square)](https://opencode.ai) [![Qwen](https://img.shields.io/badge/Qwen.ai-OAuth-red?style=flat-square)](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, 代码分析, 令牌刷新, 凭证管理, 大模型工具, 安全插件, 开源项目, 自动化攻击, 设备授权流程, 通义千问, 集成开发环境