メインコンテンツへスキップ

サーバーサイドログインプロトコル

tofu loginコマンドは、ターゲットホストから提供された構成を使用してOAuth 2.0認証リクエストを実行することをサポートします。OpenTofuモジュールレジストリなどのOpenTofuネイティブサービスのサードパーティ実装を開発する場合は、このプロトコルを実装することをお勧めします。

まず、OpenTofuはリモートサービスディスカバリーを使用して、ホストのOAuth構成を見つけます。ホストはサービス名login.v1をサポートし、OAuthクライアント構成値を含むオブジェクトを定義する必要があります。例:

コードブロック
{
"login.v1": {
"client": "tofu-cli",
"grant_types": ["authz_code"],
"authz": "/oauth/authorization",
"token": "/oauth/token",
"ports": [10000, 10010],
}
}

ディスカバリーオブジェクト内のプロパティは次のとおりです。

  • client(必須): RFC 6749セクション2.2で定義されている、リクエストを行う際に使用するclient_idの値。

    OpenTofuはパブリッククライアントであるため(エンドユーザーシステムにインストールされるため、OAuthクライアントシークレットを保護できません)、client_idは純粋にアドバイザリであり、サーバーは、認証リクエストがOpenTofuから実際に送信されているという保証として使用してはいけません。

  • grant_types(オプション):サーバーがサポートできるOAuth 2.0グラントタイプのセットを記述する文字列のJSON配列。「グラントタイプ」は、OAuthサーバーがリクエストを認証し、認証トークンを発行する特定のメカニズムを選択します。

    OpenTofu CLIは単一のグラントタイプをサポートしています。

    • authz_code: 認証コードグラントauthz_codeが存在する場合、authztokenの両方のプロパティが必要です。

    指定しない場合、grant_typesのデフォルトは["authz_code"]です。

  • authz(特定のグラントタイプに必要な場合必須):サーバーの認証エンドポイント。相対URLとして指定されている場合は、サービスディスカバリードキュメントの場所から解決されます。

  • token(特定のグラントタイプに必要な場合必須):サーバーのトークンエンドポイント。相対URLとして指定されている場合は、サービスディスカバリードキュメントの場所から解決されます。

  • ports(オプション):OpenTofuが、認証コードグラントの最初のステップのリダイレクトエンドポイントを提供するために開始する一時的なHTTPサーバーに使用できるTCPポートの包括的な範囲を提供する、2要素のJSON配列。OpenTofuは、サーバーの認証エンドポイントからの応答を受信するために、ループバックインターフェイス上のTCPリッスンポートを開きます。

    指定しない場合、OpenTofuは1024以上の任意のTCPポートを自由に選択できます。

    OpenTofuでは、各client_idを固定された有効なリダイレクトエンドポイントURLのセットに関連付ける必要があるOAuthサーバー実装との相互運用性のために、このポート範囲を制約できます。https://:10000/の形式のURLの範囲を異なる連続したポート番号で予期するようにそのようなサーバーを構成し、portsを使用してそのポート範囲を指定します。

    可能な場合は、少なくとも10個の異なるポート番号を許可し、特定のシステムで可能なすべてのポートがすでに使用されているリスクを最小限に抑えるために、10000以上の番号を割り当てることをお勧めします。

認証コードグラントをリクエストする場合、OpenTofu CLIは、システムの他のアプリケーションがリダイレクトエンドポイントへの着信リクエストをインターセプトするのを防ぐために、Proof Key for Code Exchange拡張機能を実装します。この拡張機能を実装し、トークンエンドポイントに送信されたコードチャレンジを検証するOAuthサーバー実装を選択することを強くお勧めします。

OpenTofu CLIは、OAuthリフレッシュトークンまたはトークンの有効期限をサポートしていません。サーバーが時間制限付きのトークンを発行する場合、OpenTofu CLIは、トークンの期限が切れると認証エラーを受信し始めるだけで、その後ユーザーはtofu loginを再度実行して新しいトークンを取得できます。