Skip to main content

本文档由 AI 自动翻译。如有任何不准确之处,请参考 英文原版。

OAuth 授权示例

本指南将教你如何为工具插件构建 OAuth 支持。

OAuth 是为需要访问第三方服务(如 Gmail 或 GitHub)用户数据的工具插件提供授权的更好方式。OAuth 允许工具在用户明确同意的情况下代表用户执行操作,而无需用户手动输入 API 密钥。

背景#

Dify 中的 OAuth 涉及两个独立的流程,开发者需要理解并为其进行设计。

流程 1:OAuth 客户端设置(管理员/开发者流程)#

Note

在 Dify Cloud 上,Dify 团队会为热门工具插件创建 OAuth 应用并设置 OAuth 客户端,省去用户自行配置的麻烦。

自部署 Dify 实例的管理员必须完成此设置流程。

Dify 实例的管理员或开发者首先在第三方服务上将 OAuth 应用注册为受信任的应用,由此获取将 Dify 工具提供者配置为 OAuth 客户端所需的凭证。

以下是为 Dify 的 Gmail 工具提供者设置 OAuth 客户端的步骤示例:

创建 Google Cloud 项目
  1. 前往 Google Cloud Console 创建新项目,或选择现有项目。
  2. 启用所需的 API(例如 Gmail API)。
配置 OAuth 同意屏幕
  1. 导航至 APIs & Services > OAuth consent screen。
  2. 为公共插件选择 External 用户类型。
  3. 填写应用名称、用户支持邮箱和开发者联系方式。
  4. 如需要,添加授权域名。
  5. 测试阶段:在 Test users 部分添加测试用户。
创建 OAuth 2.0 凭证
  1. 前往 APIs & Services > Credentials。
  2. 点击 Create Credentials > OAuth 2.0 Client IDs。
  3. 选择 Web application 类型。
  4. 将生成 client_id 和 client_secret。保存这些凭证。
在 Dify 中输入凭证

在 OAuth 客户端配置弹窗中输入 client_id 和 client_secret,以将工具提供者设置为客户端。

OAuth 客户端设置对话框

授权重定向 URI

在 Google OAuth 客户端页面上注册 Dify 生成的重定向 URI:

OAuth Google 重定向 URI

Info

Dify 在 OAuth 客户端配置弹窗中显示 redirect_uri。它通常遵循以下格式:

对于自部署 Dify,your-dify-domain 应与 CONSOLE_WEB_URL 保持一致。

Tip

每个服务都有独特的要求,因此请务必查阅你所集成服务的具体 OAuth 文档。

流程 2:用户授权(Dify 用户流程)#

配置 OAuth 客户端后,Dify 用户可以授权你的插件访问他们的个人账户。

OAuth 用户授权

实现#

1. 在提供者清单中定义 OAuth Schema#

提供者清单中的 oauth_schema 部分告诉 Dify,插件的 OAuth 设置需要哪些凭证,以及 OAuth 流程会产生什么。设置 OAuth 需要两个 schema:

client_schema#

定义 OAuth 客户端设置的输入:

gmail.yaml
Info

url 字段链接到第三方服务的帮助文档,为管理员和开发者在设置过程中提供参考。

credentials_schema#

指定用户授权流程产生的内容(Dify 自动管理这些):

Info

同时包含 oauth_schema 和 credentials_for_provider,可同时提供 OAuth 和 API 密钥两种认证选项。

2. 在工具提供者中完成必需的 OAuth 方法#

在实现 ToolProvider 的位置添加以下导入:

你的 ToolProvider 类必须实现以下三个 OAuth 方法(以 GmailProvider 为例):

Warning

切勿在 ToolOAuthCredentials 的凭证中返回 client_secret,否则可能导致安全问题。

3. 在工具中访问令牌#

在 Tool 实现中使用 OAuth 凭证发起经过身份验证的 API 调用:

self.runtime.credentials 自动提供当前用户的令牌。Dify 自动处理刷新。

对于同时支持 OAuth 和 API_KEY 认证的插件,可使用 self.runtime.credential_type 来区分这两种认证类型。

4. 指定正确的版本#

OAuth 需要较新版本的 SDK 和 Dify。在 requirements.txt 中固定插件 SDK 版本:

在 manifest.yaml 中,添加最低 Dify 版本: