OpenAI ChatGPT插件快速开发手册 - 认证

插件认证

插件提供了许多认证方案,以适应各种用例。要为您的插件指定认证模式,请使用清单文件。我们的插件域策略概述了我们解决域安全问题的策略。有关可用认证选项的示例,请参阅示例部分,其中展示了所有不同的选择。

ai-plugin.json 文件需要设置一个认证模式。即使您选择不使用认证,仍然需要指定 "auth": { "type": "none" }

我们只支持本地主机开发而不使用认证;如果您想使用服务、用户或OAuth认证,您需要设置一个远程服务器。

服务级别

我们建议使用服务级别的认证,因为它可以让开发人员控制他们的插件的使用方式,但也不会给用户带来额外的开销。

如果您想专门使OpenAI插件能够与您的API配合使用,您可以在插件安装流程中提供客户端秘钥。这意味着所有来自OpenAI插件的流量将经过身份验证,但不会在用户级别上进行。这种流程可以为最终用户提供简单的体验,但从API的角度来看,控制较少。

以下是使用ChatGPT插件商店中的“开发您自己的插件”来开始的步骤,然后输入您的插件托管的域名。
ai-plugin.json 中,将 auth.type 设置为 "service_http",如我们的服务级别认证示例中所示。
您将被要求输入您的服务访问令牌,这是您在代码中指定的字符串。
我们会安全地存储您的服务访问令牌的加密副本,以便在没有额外身份验证的情况下安装插件。
服务访问令牌将在插件请求的授权标头中发送。
一旦您将服务访问令牌添加到ChatGPT UI中,您将会收到一个验证令牌。
将验证令牌添加到 ai-plugin.json 文件的 auth 部分中,如下所示。

"auth": {
  "type": "service_http",
  "authorization_type": "bearer",
  "verification_tokens": {
    "openai": "用ChatGPT_UI中生成的验证令牌替换此处的字符串"
  }
}

验证令牌设计用于支持多个应用程序。您只需添加要支持的其他应用程序:

"verification_tokens": {
  "openai": "用ChatGPT_UI中生成的验证令牌替换此处的字符串",
  "other_service": "abc123"
}

OAuth

插件协议与OAuth兼容。我们期望的OAuth流程的一个简单示例可能如下所示:

开始时,在ChatGPT插件商店中选择“开发您自己的插件”,然后输入您插件托管的域名(不能是localhost)。
ai-plugin.json 中,将 auth.type 设置为 "oauth",如我们的OAuth示例中所示。
然后,您将被要求输入OAuth客户端ID和客户端秘钥。
客户端ID和秘钥可以是简单的文本字符串,但应遵循OAuth的最佳实践。
我们会存储加密版本的客户端秘钥,而客户端ID则可供最终用户使用。
一旦您将客户端ID和客户端秘钥添加到ChatGPT UI中,您将会收到一个验证令牌。
将验证令牌添加到 ai-plugin.json 文件的 auth 部分中,如下所示。
OAuth请求将包括以下信息:request={'grant_type': 'authorization_code', 'client_id': 'id_set_by_developer', 'client_secret': 'secret_set_by_developer', 'code': 'abc123', 'redirect_uri': 'https://chat.openai.com/aip/plugin-some_plugin_id/oauth/callback'}
为了让某人使用OAuth插件,他们需要安装插件,然后在ChatGPT UI中会出现一个“以…身份登录”的按钮。
authorization_url 端点应该返回一个类似于以下内容的响应:{ "access_token": "example_token", "token_type": "bearer", "refresh_token": "example_token", "expires_in": 59 }
在用户登录过程中,ChatGPT会使用指定的 authorization_content_type 对您的 authorization_url 发出请求,我们期望得到一个访问令牌和可选的刷新令牌,我们用于定期获取新的访问令牌。
每当用户向插件发出请求时,用户的令牌将通过授权标头传递:(“Authorization”:“[Bearer/Basic][user’s token]”)。
出于安全原因,我们要求OAuth应用程序使用 state 参数。
以下是 ai-plugin.json 文件中可能包含的OAuth配置示例:

"auth": {
  "type": "oauth",
  "client_url": "https://example.com/authorize",
  "scope": "",
  "authorization_url": "https://example.com/auth/",
  "authorization_content_type": "application/json",
  "verification_tokens": {
    "openai": "用ChatGPT_UI中生成的验证令牌替换此处的字符串"
  }
}

为了更好地理解OAuth的URL结构,以下是有关字段的简短说明:

  • 当您使用ChatGPT设置插件时,您将被要求提供您的OAuth client_id 和 client_secret。
  • 当用户登录插件

时,ChatGPT会将用户的浏览器重定向到 "[client_url]?response_type=code&client_id=[client_id]&scope=[scope]&state=xyz123&redirect_uri=https%3A%2F%2Fchat.openai.com%2Faip%2F[plugin_id]%2Foauth%2Fcallback"

  • plugin_id 通过请求传递给您的OAuth端点(请注意,它在ChatGPT UI中今天是不可见的,但在将来可能可见)。您可以在那里检查请求,以查看 plugin_id。我们希望在重定向回 redirect_uri 时传递 state。如果状态与初始状态不匹配或已过期,身份验证流程将失败。
  • 在插件重定向回给定的 redirect_uri 后,ChatGPT将通过使用授权标头的内容类型 authorization_content_type 和参数 { “grant_type”:“authorization_code”,“client_id”:[client_id],“client_secret”:[client_secret],“code”:[与重定向返回的代码相同],“redirect_uri”:[与之前相同的重定向URI] } 来完成OAuth流程。

无认证

我们不推荐使用“无认证”,请考虑使用“服务认证”。
我们支持不需要认证的流程,适用于不需要认证的应用程序,用户可以直接向您的API发送请求,没有任何限制。如果您有一个开放的API,您想让每个人都可以使用,这将特别有用,因为它允许流量来自不仅仅是OpenAI插件请求的来源。

"auth": {
  "type": "none"
}

用户级别

由于当前的UI限制,我们不允许带有“用户认证”的插件进入插件商店。我们预计这可能会在未来发生变化。就像用户可能已经在使用您的API一样,我们允许通过在插件安装期间在ChatGPT UI中复制和粘贴其秘钥来进行用户级别的认证。虽然我们在存储在数据库中的秘钥时对其进行了加密,但鉴于用户体验较差,我们不建议采用这种方法。

  • 用户在安装插件时粘贴其访问令牌
  • 我们存储一个加密版本的令牌
  • 然后我们在向插件发出请求时将其传递给Authorization标头(“Authorization”:“[Bearer/Basic][user’s token]”)
"auth": {
  "type": "user_http",
  "authorization_type": "bearer"
}
posted @ 2023-08-13 09:37  ryan-Z  阅读(235)  评论(0编辑  收藏  举报