跳至主要内容

服务器端登录协议

tofu login 命令支持使用目标主机提供的配置执行 OAuth 2.0 授权请求。如果您正在开发任何 OpenTofu 原生服务(例如 OpenTofu 模块注册表)的第三方实现,则可能希望实现此协议。

首先,OpenTofu 使用 远程服务发现 查找主机的 OAuth 配置。主机必须支持服务名称 login.v1 并为其定义一个包含 OAuth 客户端配置值的 JSON 对象,如下所示

代码块
{
"login.v1": {
"client": "tofu-cli",
"grant_types": ["authz_code"],
"authz": "/oauth/authorization",
"token": "/oauth/token",
"ports": [10000, 10010],
}
}

发现对象中的属性如下:

  • client(必填):在进行请求时要使用的 client_id 值,如 RFC 6749 第 2.2 节 中所定义。

    由于 OpenTofu 是一个公共客户端(它安装在最终用户系统上,因此无法保护 OAuth 客户端密钥),因此 client_id 纯粹是建议性的,服务器不得将其用作授权请求确实来自 OpenTofu 的保证。

  • grant_types(可选):一个 JSON 字符串数组,描述服务器能够支持的一组 OAuth 2.0 授权类型。“授权类型”选择了一种特定的机制,通过该机制 OAuth 服务器对请求进行身份验证并颁发授权令牌。

    OpenTofu CLI 支持一种授权类型

    • authz_code授权码授权。当存在 authz_code 时,authztoken 属性都是必需的。

    如果未指定,则 grant_types 默认为 ["authz_code"]

  • authz(如果特定授权类型需要则为必填):服务器的 授权端点。如果以相对 URL 的形式给出,则从服务发现文档的位置解析。

  • token(如果特定授权类型需要则为必填):服务器的 令牌端点。如果以相对 URL 的形式给出,则从服务发现文档的位置解析。

  • ports(可选):一个包含两个元素的 JSON 数组,给出 OpenTofu 用于启动临时 HTTP 服务器以提供 重定向端点(授权码授权的第一步)的 TCP 端口的包含范围。OpenTofu 在环回接口上打开一个 TCP 监听端口,以便接收来自服务器授权端点的响应。

    如果未指定,则 OpenTofu 可以自由选择任何大于或等于 1024 的 TCP 端口。

    OpenTofu 允许约束此端口范围以与需要将每个 client_id 与一组固定的有效重定向端点 URL 关联的 OAuth 服务器实现实现互操作性。将此类服务器配置为预期一系列形式为 http://localhost:10000/ 的 URL,其中包含不同的连续端口号,然后使用 ports 指定该端口范围。

    如果可能,我们建议至少允许 10 个不同的端口号,并将它们分配给大于或等于 10000 的数字,以最大程度地降低特定系统上所有可能的端口都已被使用的风险。

在请求授权码授权时,OpenTofu CLI 会实现 代码交换证明密钥 扩展,以防止系统上的其他应用程序拦截传入重定向端点的请求。我们强烈建议您选择一个也实现了此扩展并验证发送到令牌端点的代码挑战的 OAuth 服务器实现。

OpenTofu CLI 不支持 OAuth 刷新令牌或令牌过期。如果您的服务器发出时间受限的令牌,则 OpenTofu CLI 将在令牌过期后简单地开始接收授权错误,之后用户可以再次运行 tofu login 以获取新令牌。