NIP-98はNostrイベントを使用したHTTP認証を定義します。パスワード、APIキー、OAuthフローなしに、サーバーが標準HTTPリクエストでクライアントのNostrアイデンティティを検証できるようにします。

仕組み

クライアントがHTTPリクエストを認証する必要がある場合、kind 27235イベントを作成します。このイベントはタグにターゲットURLとHTTPメソッドを含み、認証を特定のリクエストに紐づけます。

{
  "id": "<64-char hex>",
  "pubkey": "<64-char hex>",
  "created_at": 1742860800,
  "kind": 27235,
  "tags": [
    ["u", "https://files.example.com/upload"],
    ["method", "POST"],
    ["payload", "<sha256-hash-of-request-body>"]
  ],
  "content": "",
  "sig": "<128-char hex>"
}

クライアントはこのイベントに署名し、base64エンコードして、NostrスキームでHTTP Authorizationヘッダーに送信します:

Authorization: Nostr <base64-encoded-signed-event>

サーバーはイベントをデコードし、署名を検証し、URLとメソッドが実際のリクエストと一致することを確認し、タイムスタンプが最近であることを確認します。すべてのチェックに合格すれば、サーバーはどのNostr pubkeyがリクエストを行ったかを把握できます。

オプションのpayloadタグにはリクエストボディのSHA-256ハッシュが含まれ、認証イベントが異なるコンテンツで再利用されることを防ぎます。タイムスタンプチェック(サーバーは通常、数分以上古いイベントを拒否)はリプレイ攻撃を防止します。

ユースケース

Blossomサーバーはファイルのアップロードと削除を認証するためにNIP-98を使用し、保存されたメディアを特定のNostrアイデンティティに紐づけます。ファイルホスティングサービスはpubkeyごとのアップロードクォータを適用するために使用します。独自のアカウントシステムを維持せずにNostrユーザーを識別する必要があるHTTP APIは、NIP-98ヘッダーをアイデンティティの証明として受け入れることができます。


主要ソース:

掲載号: