快速结论:该报错是 Dify 内置工具提供方的自定义 OAuth 客户端配置接口(GET 方法)缺少管理员和 RBAC 权限校验装饰器,导致任意工作区成员都能读取敏感配置。优先排查并修复 api/controllers/console/workspace/tool_providers.py 中的 ToolOAuthCustomClient.get 方法。
适用环境:Dify 1.14.2(main 分支),Self Hosted(源码部署或 Docker 部署),启用 RBAC 的工作区。
最快修复方案:暂无确认的一步修复方案。Issue 已确认需要为 get 方法补充两个装饰器,但尚未验证是否已合入官方发布版本,需自行修改源码或等待修复版本。
注意事项:补充装饰器属于安全修复,修改后需重新构建或重启 Dify API 服务;同时注意 ToolBuiltinProviderGetOauthClientSchemaApi.get 也有类似问题,但该接口返回的是 OAuth 客户端字段结构而非实际凭据,风险较低。
问题场景
在启用 RBAC 的 Dify 工作区中,管理员配置了内置工具提供方(如 Google、Slack)的自定义 OAuth 客户端。随后使用普通工作区成员(非管理员、非所有者,且没有 credential_manage RBAC 权限)登录,调用 GET /console/api/workspaces/current/tool-provider/builtin/<provider>/oauth/custom-client 接口,发现请求成功并返回了自定义 OAuth 客户端配置详情。
报错原文
security(api): GET /tool-provider/builtin/{provider}/oauth/custom-client missing admin and RBAC permission decorators
原因分析
已确认原因:在 api/controllers/console/workspace/tool_providers.py 中,ToolOAuthCustomClient.get 方法仅包含以下装饰器:
@setup_required@login_required@account_initialization_required@with_current_tenant_id
缺少了同类的 POST(第 1273 行)和 DELETE(第 1307 行)方法都有的两个权限装饰器:@is_admin_or_owner_required 和 @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.CREDENTIAL_MANAGE, resource_required=False)。
根本原因:在 RBAC 功能加入时(#37107),GET 方法没有被同步更新以匹配同类的 POST 和 DELETE 方法。由于该接口返回的是实际存储的 OAuth 客户端配置,缺少权限校验意味着任何已认证的工作区成员都能读取敏感配置。
环境排查
- 确认 Dify 版本是否为 1.14.2(main 分支)或更早版本。
- 检查部署方式:源码部署或 Docker 部署。
- 确认工作区是否已启用 RBAC 功能。
- 检查
api/controllers/console/workspace/tool_providers.py文件中ToolOAuthCustomClient.get方法的装饰器列表是否缺少权限校验。
解决步骤
- 备份
api/controllers/console/workspace/tool_providers.py文件。 - 找到
ToolOAuthCustomClient.get方法(约第 1297 行),在现有装饰器中添加缺失的两个权限装饰器,使其与同类的 POST 和 DELETE 方法一致:
@setup_required
@login_required
@is_admin_or_owner_required
@rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.CREDENTIAL_MANAGE, resource_required=False)
@account_initialization_required
@with_current_tenant_id
def get(self, current_tenant_id: str, provider: str):
return BuiltinToolManageService.get_custom_oauth_client_params(tenant_id=current_tenant_id, provider=provider)
- 重新构建或重启 Dify API 服务使修改生效。
- 如条件允许,可提交 Pull Request 到官方仓库,等待合并到后续版本。
验证方法
修复后,使用普通工作区成员(非管理员、非所有者,且没有 credential_manage RBAC 权限)登录,再次调用 GET /console/api/workspaces/current/tool-provider/builtin/<provider>/oauth/custom-client 接口,应返回 403 Forbidden,与 POST 和 DELETE 方法的行为一致。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


