-
Notifications
You must be signed in to change notification settings - Fork 66
Create new connector plugin to VDSaccount #312
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mike-brown8
wants to merge
16
commits into
apache:main
Choose a base branch
from
mike-brown8:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
815a6a6
创建 connector-vds/vds.go
mike-brown8 21372bf
创建 README.md
mike-brown8 3b678e5
创建 info.yaml
mike-brown8 9edf6f9
创建 go.sum
mike-brown8 724fb6f
创建 go.mod
mike-brown8 ce7ef82
创建 constants.go
mike-brown8 dfdc4d3
创建 LICENSE
mike-brown8 50484ef
创建 i18n/translation.go
mike-brown8 a65afb6
创建 zh_CN.yaml
mike-brown8 40d9a78
创建 en_US.yaml
mike-brown8 edaf693
Merge pull request #1 from mike-brown8/mike-brown8-patch-1
mike-brown8 ceeb7e1
Add files via upload
mike-brown8 540ab11
Create .gitkeep
mike-brown8 e0ee815
Add files via upload
mike-brown8 2226541
Delete connector-vds/assets/.gitkeep
mike-brown8 a6b2788
Delete connector-vds/EMlogo-large1x.png
mike-brown8 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| Apache License | ||
| Version 2.0, January 2004 | ||
|
|
||
| http://www.apache.org/licenses/ | ||
|
|
||
| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||
|
|
||
| 1. Definitions. | ||
|
|
||
| "License" shall mean the terms and conditions for use, reproduction, and distribution as defined in Sections 1 through 9 of this document. | ||
|
|
||
| "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. | ||
|
|
||
| "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. | ||
|
|
||
| "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. | ||
|
|
||
| "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. | ||
|
|
||
| "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. | ||
|
|
||
| "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, indicated by a copyright notice that is included in or attached to the work. | ||
|
|
||
| "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship, thus including but not limited to any such work that incorporates the Work or any portion thereof. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. | ||
|
|
||
| "Contribution" shall mean any work of authorship, including the original Work and any Derivative Works thereof, and any modifications and enhancements to such work or Derivative Works thereof made available under the License, indicated by a copyright notice that is included in or attached to the work (including but not limited to a notice in the SOURCE file from which the work originated, if applicable). | ||
|
|
||
| "Contributor" shall mean Licensor and/or any Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. | ||
|
|
||
| 2. Grant of Copyright License. | ||
|
|
||
| Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. | ||
|
|
||
| 3. Grant of Patent License. | ||
|
|
||
| Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. | ||
|
|
||
| 4. Redistribution. | ||
|
|
||
| You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: | ||
|
|
||
| (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and | ||
|
|
||
| (b) You must cause any modified files to carry prominent notices stating that You changed the files; and | ||
|
|
||
| (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and | ||
|
|
||
| (d) If the Work includes a "NOTICE" text file, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE from the Work, provided that such additional attribution notices cannot be construed as modifying the License. | ||
|
|
||
| You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions of this License. | ||
|
|
||
| 5. Submission of Contributions. | ||
|
|
||
| Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contribution. | ||
|
|
||
| 6. Trademarks. | ||
|
|
||
| This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. | ||
|
|
||
| 7. Disclaimer of Warranty. | ||
|
|
||
| Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. | ||
|
|
||
| 8. Limitation of Liability. | ||
|
|
||
| In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. | ||
|
|
||
| 9. Accepting Warranty or Additional Liability. | ||
|
|
||
| While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. | ||
|
|
||
| END OF TERMS AND CONDITIONS |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,278 @@ | ||
| # VDS Account Connector | ||
|
|
||
| [](https://opensource.org/licenses/Apache-2.0) | ||
|
|
||
| VDS账户连接器是Apache Answer的官方OAuth连接器,与VDS账户系统集成,提供无缝的单点登录(SSO)功能。 | ||
|
|
||
| ## 简介 | ||
|
|
||
| VDS Account Connector 允许用户通过他们的VDS账户直接登录到Apache Answer社区。该连接器完全遵循VDS官方OAuth 2.0标准实现,所有复杂的平台细节(签名管理、端点配置)都已自动化处理。 | ||
|
|
||
| ## 功能特性 | ||
|
|
||
| - ✅ **完整OAuth 2.0实现** - VDS官方OAuth 2.0标准支持 | ||
| - ✅ **零配置端点** - VDS全球端点(open-global.vdsentnet.com)已硬编码 | ||
| - ✅ **自动签名管理** - 平台签名自动获取、缓存、刷新,无需用户干预 | ||
| - ✅ **自动用户信息提取** - 自动解析VDS API响应 | ||
| - ✅ **开箱即用Logo** - 内置官方EM Logo,无需额外配置 | ||
| - ✅ **国际化支持** - 中英文多语言支持 | ||
| - ✅ **错误恢复** - 智能重试机制,自动处理网络异常 | ||
|
|
||
| ## 安装 | ||
|
|
||
| 1. 克隆或下载VDS连接器 | ||
| 2. 将文件夹复制到Apache Answer plugins目录 | ||
| 3. 重新编译或重启Apache Answer服务 | ||
|
|
||
| ## 配置 | ||
|
|
||
| ### 前置条件 | ||
|
|
||
| 在配置此连接器之前,你需要: | ||
|
|
||
| 1. **VDS开发者账户** - 在[VDS开发者平台](https://developer.vds.pub/)注册 | ||
| 2. **创建应用** - 创建一个新应用以获得: | ||
| - `Client ID` - 应用ID(vap_xxxx格式) | ||
| - `Client Secret` - 应用密钥 | ||
| 3. **配置回调URL** - 在应用设置中配置OAuth回调地址 | ||
|
|
||
| ### 配置参数 | ||
|
|
||
| VDS连接器采用极简配置方案,只需要2个参数。所有VDS特定配置(端点、签名、Logo)都已自动处理: | ||
|
|
||
| | 参数 | 必需 | 说明 | | ||
| |-----|------|------| | ||
| | **Client ID** | ✅ | VDS应用ID(vap_xxxx格式),从VDS开发者平台获得 | | ||
| | **Client Secret** | ✅ | VDS应用密钥,从VDS开发者平台获得 | | ||
|
|
||
| **注意**:平台签名(Platform Signature)由连接器自动在运行时获取和管理,无需用户手动配置。 | ||
|
|
||
| ## 自动管理的功能 | ||
|
|
||
| ### 平台签名(Platform Signature)管理 | ||
| 连接器自动处理VDS平台签名的获取和刷新: | ||
|
|
||
| - **自动获取** — 在首次使用时自动调用VDS `/api/auth/token` 端点获取平台签名 | ||
| - **智能缓存** — 签名缓存在内存中,避免重复请求 | ||
| - **自动刷新** — 当签名即将过期(剩余时间<3分钟)时自动换新 | ||
| - **错误恢复** — 失败时自动重试(最多3次),采用指数退避策略 | ||
| - **线程安全** — 使用互斥锁确保并发访问安全 | ||
|
|
||
| ### Logo处理 | ||
| 连接器内置官方EM Logo,支持两种工作模式: | ||
|
|
||
| - **自动模式** — 首次加载时自动读取嵌入的 EMlogo-large1x.png,转换为 base64 DataURI,缓存使用 | ||
| - **初始化缓存** — 配置接收后立即生成并缓存 Logo DataURI,避免每次请求都转换 | ||
|
|
||
| ## VDS OAuth 流程 | ||
|
|
||
| 此连接器遵循VDS官方OAuth流程,所有端点已自动配置: | ||
|
|
||
| ### 1. 授权请求 | ||
| 用户被重定向到VDS授权页面: | ||
| ``` | ||
| GET https://account.vds.pub/authorize? | ||
| client_id=vap_xxxxx& | ||
| redirect_uri=YOUR_CALLBACK_URL& | ||
| response_type=code& | ||
| scope=openid,profile& | ||
| state=RANDOM_STATE | ||
| ``` | ||
|
|
||
| ### 2. 获取授权码 | ||
| 用户授权后,VDS回跳到回调URL: | ||
| ``` | ||
| YOUR_CALLBACK_URL?code=AUTH_CODE&state=RANDOM_STATE | ||
| ``` | ||
|
|
||
| ### 3. 交换Access Token(已自动处理) | ||
| 后端使用授权码交换access token。连接器自动处理平台签名注入: | ||
| ``` | ||
| POST https://open-global.vdsentnet.com/api/proxy/account/sso/token | ||
| Authorization: Bearer <platform_signature> (自动管理) | ||
| Content-Type: application/x-www-form-urlencoded | ||
|
|
||
| grant_type=authorization_code& | ||
| code=AUTH_CODE& | ||
| redirect_uri=YOUR_CALLBACK_URL& | ||
| client_id=vap_xxxxx& | ||
| client_secret=YOUR_APP_SECRET | ||
| ``` | ||
|
|
||
| ### 4. 获取用户信息(已自动处理) | ||
| 使用access token从VDS服务器获取用户信息: | ||
| ``` | ||
| GET https://open-global.vdsentnet.com/api/proxy/account/sso/userinfo | ||
| Authorization: Bearer <platform_signature> (自动管理) | ||
| X-OAuth-Access-Token: <access_token> | ||
| ``` | ||
|
|
||
| 响应示例: | ||
| ```json | ||
| { | ||
| "sub": "10001", | ||
| "name": "示例用户", | ||
| "username": "example_user", | ||
| "email": "user@example.com", | ||
| "avatar_url": "https://...", | ||
| "phone_number": "+86137****8072", | ||
| "updated_at": 1774002667 | ||
| } | ||
| ``` | ||
|
|
||
| ### 自动化工作流时序 | ||
|
|
||
| ``` | ||
| 用户授权 | ||
| │ | ||
| ├─→ ConnectorSender: 生成授权URL | ||
| │ | ||
| └─→ [VDS授权服务] | ||
| │ | ||
| └─→ ConnectorReceiver: 接收回调 | ||
| │ | ||
| ├─→ exchangeCodeForToken() | ||
| │ ├─→ getPlatformSignature() [自动获取/刷新] | ||
| │ └─→ 交换OAuth Token | ||
| │ | ||
| └─→ getUserInfo() | ||
| ├─→ getPlatformSignature() [检查缓存] | ||
| └─→ 获取用户信息并返回 | ||
| ``` | ||
|
|
||
| ## 硬编码配置 | ||
|
|
||
| 以下VDS特定配置已固定在代码中,无需手动修改: | ||
|
|
||
| **OAuth端点:** | ||
| - 授权端点: `https://account.vds.pub/authorize` | ||
| - Token交换: `https://open-global.vdsentnet.com/api/proxy/account/sso/token` | ||
| - 签名交换: `https://open-global.vdsentnet.com/api/auth/token` | ||
| - 用户信息: `https://open-global.vdsentnet.com/api/proxy/account/sso/userinfo` | ||
|
|
||
| **用户信息字段映射:** | ||
| | Answer字段 | VDS API字段 | JSON路径 | | ||
| |-----------|----------|---------| | ||
| | ExternalID | User ID | `sub` | | ||
| | DisplayName | 昵称 | `name` | | ||
| | Username | 用户名 | `username` | | ||
| | Email | 邮箱 | `email` | | ||
| | Avatar | 头像 | `avatar_url` | | ||
|
|
||
| **OAuth范围:** `openid,profile` | ||
|
|
||
| ## API文档 | ||
|
|
||
| 关于VDS OAuth实现的详细信息,参考官方文档: | ||
|
|
||
| - [VDS账户快速接入(OAuth)](https://developer.vds.pub/docs?path=VDS%E8%B4%A6%E6%88%B7&name=VDS%E8%B4%A6%E6%88%B7%E5%BF%AB%E9%80%9F%E6%8E%A5%E5%85%A5%EF%BC%88OAuth%EF%BC%89) | ||
| - [授权端点](https://developer.vds.pub/docs?path=VDS%E8%B4%A6%E6%88%B7&name=%E6%8E%88%E6%9D%83%E7%AB%AF%E7%82%B9%EF%BC%88Authorize%EF%BC%8Caccount.sso.authorize%EF%BC%89) | ||
| - [Token交换端点](https://developer.vds.pub/docs?path=VDS%E8%B4%A6%E6%88%B7&name=%E7%AD%BE%E5%90%8D%E4%BA%A4%E6%8D%A2%E7%AB%AF%E7%82%B9%EF%BC%88Token%EF%BC%8Caccount.sso.token%EF%BC%89) | ||
| - [用户信息端点](https://developer.vds.pub/docs?path=VDS%E8%B4%A6%E6%88%B7&name=%E7%94%A8%E6%88%B7%E4%BF%A1%E6%81%AF%E7%AB%AF%E7%82%B9%EF%BC%88UserInfo%EF%BC%8Caccount.sso.userinfo%EF%BC%89) | ||
|
|
||
| ## 故障排查 | ||
|
|
||
| ### 1. "无法获取平台签名" 错误 | ||
| **原因:** 连接器无法调用VDS `/api/auth/token` 端点或连接器凭证不正确 | ||
|
|
||
| **解决方案:** | ||
| - 验证 Client ID 和 Client Secret 的正确性(从VDS开发者平台复制) | ||
| - 检查网络连接,确保能访问 `open-global.vdsentnet.com` | ||
| - 查看日志中的详细错误信息,确认是否重试3次后仍失败 | ||
| - 确认VDS应用在开发者平台未被停用 | ||
|
|
||
| ### 2. "授权码无效或重定向URI不匹配" | ||
| **原因:** 回调URL配置不一致 | ||
|
|
||
| **解决方案:** | ||
| - 确保Apache Answer的回调URL(redirect_uri)与VDS应用配置中的回调地址完全匹配 | ||
| - 检查URL是否包含正确的协议前缀(http://或https://) | ||
| - 验证URL是否正确编码(不应包含特殊字符) | ||
|
|
||
| ### 3. "用户信息获取失败" | ||
| **原因:** VDS API请求失败或响应格式异常 | ||
|
|
||
| **解决方案:** | ||
| - 平台签名由连接器自动管理,无需手动干预 | ||
| - 检查 Access Token 是否有效且未过期 | ||
| - 确认VDS API端点可访问 | ||
| - 查看日志中的HTTP状态码,根据错误代码排查 | ||
|
|
||
| ### 4. Logo不显示 | ||
| **原因:** 嵌入的Logo文件损坏或加载失败 | ||
|
|
||
| **解决方案:** | ||
| - 连接器使用内置的 EMlogo-large1x.png,已自动转换为 base64 DataURI | ||
| - 检查浏览器控制台是否有报错 | ||
| - 若Logo无法正常显示,检查 assets/EMlogo-large1x.png 文件是否存在且完整 | ||
| - 重新编译插件 | ||
|
|
||
| ### 5. "性能问题 - 每次请求都很慢" | ||
| **原因:** Platform signature缓存未生效或频繁刷新 | ||
|
|
||
| **解决方案:** | ||
| - 连接器自动缓存平台签名,首次获取后无需再次请求(除非即将过期) | ||
| - 刷新周期为:签名有效期 - 3分钟 | ||
| - 检查日志中是否频繁出现"Successfully obtained platform signature"消息 | ||
| - 若频繁出现,可能是时间同步问题,检查服务器时间是否正确 | ||
|
|
||
| ## 版本历史 | ||
|
|
||
| ### v2.0.0 (2026-03-30) | ||
| **主要变更:** | ||
| - ✨ **自动平台签名管理** - 无需用户配置,连接器自动获取、缓存、刷新签名 | ||
| - ✨ **简化配置** - 从4个参数减少到2个(仅需client_id和client_secret) | ||
| - ✨ **内置Logo** - 使用官方EM Logo,自动转换为DataURI,无需额外配置 | ||
| - 🔧 **智能重试** - 失败自动重试最多3次,支持指数退避 | ||
| - 🔧 **线程安全** - 使用互斥锁保护缓存,支持并发请求 | ||
| - 📝 **详细日志** - 增加Debug和Info级日志便于问题诊断 | ||
| - 🐛 **代码清理** - 删除冗余代码,简化实现逻辑 | ||
|
|
||
| **破坏性变更:** | ||
| - 不再需要配置 `platform_signature` 参数 | ||
| - 不再需要配置 `logo_svg` 参数 | ||
| - 若从v1.x升级,需要删除这两个旧配置项 | ||
|
|
||
| ### v1.0.0 | ||
| - 首次发布 | ||
| - 基础OAuth支持 | ||
| - 用户配置platform_signature和logo_svg | ||
|
|
||
| ## 开发 | ||
|
|
||
| ### 编译 | ||
| ```bash | ||
| go mod download | ||
| go build | ||
| ``` | ||
|
|
||
| ### 测试 | ||
| ```bash | ||
| go test ./... | ||
| ``` | ||
|
|
||
| ## 许可证 | ||
|
|
||
| 此项目采用Apache License 2.0许可证。详见[LICENSE](LICENSE)文件。 | ||
|
|
||
| ## 支持 | ||
|
|
||
| 如有问题或建议,请: | ||
| - 访问[VDS开发者平台](https://developer.vds.pub/)获取官方支持 | ||
| - 提交Issue到项目仓库 | ||
|
|
||
| ## 更新日志 | ||
|
|
||
| ### v1.1.0 (2026-03-31) | ||
| - 🎯 **大幅简化配置** - 从15个字段简化到仅4个必需字段 | ||
| - 🔒 **硬编码VDS端点** - 确保始终连接到正确的VDS服务器 | ||
| - 🛡️ **移除邮箱验证检查** - 简化用户信息处理流程 | ||
| - 🎨 **改进Logo处理** - 支持PNG base64和SVG格式 | ||
| - 📝 **优化代码结构** - 提高代码可维护性和清晰度 | ||
|
|
||
| ### v1.0.0 (2026-03-30) | ||
| - 初始版本发布 | ||
| - OAuth 2.0完整实现 | ||
| - VDS用户信息端点集成 | ||
| - 国际化支持(中文/英文) | ||
| - JSON路径灵活映射 | ||
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The changelog claims the config was simplified to “4 required fields”, but the current implementation/config UI only exposes 2 required fields (
client_idandclient_secret). Please update the changelog to reflect the actual behavior so users aren’t confused during setup/upgrades.