final
optional
kind 0
(user metadata
)にはインターネット識別子 (eメールのようなアドレス) を値として"nip05"
というキーを指定できる。"インターネット識別子"に対する多種多様な仕様のリンクがあるが、NIP-05は<local-part>
部分がa-z0-9-_.
で大文字と小文字を区別しないことを前提としている。
クライアントは識別子を<local-part>
と<domain>
に分けた上でそれらの値でhttps://<domain>/.well-known/nostr.json?name=<local-part>
にGET要求を行う。
結果として、16進数で表される公開鍵に対応した"names"
キーを持つ、JSONドキュメントオブジェクトが返されなければならない。指定された<name>
の公開鍵がuser metadata
イベントのpubkey
と一致する場合、クライアントは与えられた公開鍵が実際にその識別子で照会できると結論付ける。
クライアントが下記のようなイベントを見た時。
{
"pubkey": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9",
"kind": 0,
"content": "{\"name\": \"bob\", \"nip05\": \"bob@example.com\"}"
// other fields...
}
https://example.com/.well-known/nostr.json?name=bob
のようにGET要求を行い、次のような応答を得る。
{
"names": {
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
}
}
あるいは、推奨される"relays"
属性が追加される場合は次の通り。
{
"names": {
"bob": "b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9"
},
"relays": {
"b0635d6a9851d3aed0cd6c495b282167acf761729078d975fc341b22650b07b9": [ "wss://relay.example.com", "wss://relay2.example.com" ]
}
}
上記の例のように公開鍵が"names"
で与えられたものと一致する場合、関連付けが正しいことを意味し、"nip05"
識別子は有効なものとして表示できる。
推奨される"relays"
属性には、公開鍵をプロパティ名、リレーURLの配列を値に持つオブジェクトを含められる。存在する場合、クライアントが特定のユーザーを見つけられるリレーを知るために使用可能である。クエリ文字列に基づいて動的に/.well-known/nostr.json
ファイルを提供するWebサーバーは、利用可能な場合、同じ応答で提供する名前に於けるリレーデータも提供すべきである (SHOULD)。
クライアントは_インターネット識別子_からユーザーの公開鍵を見つける機能を実装しても良い。流れは上記の逆である。まず、クライアントは_well-known_URLを参照して、そこからユーザーの公開鍵を取得する。その後ユーザーのkind0
の取得を試みて、"nip05"
と合致するか確認する。
NIP-05はユーザーを_検証_するためではなく、連絡先の交換や検索を容易とするために_識別_することを目的としている。 例外は有名なドメインを所有する (企業等) あるいは関係する人 (プロジェクト等) であり、NIP-05をそのドメインとの関係、ひいてはその背後にある組織との関係を証明するものとして利用でき、信用の要素を得ることができる。
クライアントはこれをユーザーが他のプロフィールの検索で使えるようにできる。クライアントが検索ボックスなどを持っている場合、そこに"bob@example.com"と入力でき、クライアントはそれを識別して適切なクエリで公開鍵を取得し、ユーザーに提案できる。
例えば、もし公開鍵abc…def
をもったbob@bob.com
を見つけて、ユーザーがそのプロフィールをフォローすることにした際、クライアントはbob@bob.com
ではなくabc…def
を第一参照先にする必要がある。何らかの理由で、将来https://bob.com/.well-known/nostr.json?name=bob
が公開鍵1d2...e3f
を返すようになった場合でもクライアントはフォロー済みユーザーリストでabc...def
を置き換えてはならない。但し、そのユーザーの”bob@bob.com”は無効な”nip05”
プロパティとなるため、表示を止めるべきである。
鍵は16進数の形式で返される必要がある。NIP-19npub
形式はこのNIPではなく、クライアントUIでの表示にのみ使用される。
クライアントは_@domain
識別子を”ルート”識別子として扱い、<domain>
のみを表示できる。例えば、Bobがbob.com
を所有している場合、bob@bob.com
のような冗長な識別子を望まないかもしれない。代わりに、_bob.com
を使用してNostrクライアントが如何なる目的でも単にbob.com
として扱い、表示することを期待できる。
パスの代わりにクエリ文字列として<local-part>
を追加することで、このプロトコルはオンデマンドでJSONを生成できる動的なサーバーと、複数の名前を含むJSONファイルを置く静的なサーバーの両方に対応できる。
JavaScript NostrアプリはブラウザのCORSポリシーによってユーザーのドメインで/.well-known/nostr.json
へのアクセスを妨げられる可能性がある。CORSがJSに資源を読み込ませなかった場合、JSプログラムはそれを存在しない資源と同じネットワーク障害と見做すため、バニラJSアプリが障害はCORSの問題で引き起こされたことを伝える方法は無い。JS Nostrアプリは/.well-known/nostr.json
ファイルを要求した時ネットワーク障害に遭遇したら、サーバのCORSポリシーを確認することをユーザに勧めた方がいいかもしれない。
$ curl -sI https://example.com/.well-known/nostr.json?name=bob | grep -i ^Access-Control
Access-Control-Allow-Origin: *
ユーザーは最新のブラウザで実行されるバニラJSアプリが検証できるよう、/.well-known/nostr.json
をAccess-Control-Allow-Origin: *
のHTTPヘッダ付きで提供しなければならない。
/.well-known/nostr.json`のエンドポイントはHTTPリダイレクトを返してはならない (MUST)。
取得する側は/.well-known/nostr.json
からのHTTPリダイレクトを無視しなければならない (MUST)。