✔️

Nostr で認証バッジを付ける

2023/02/12に公開

Nostr とは

新たに出てきた分散型 SNS のプロトコルです。
プロトコルなので Nostr というサービスがあるわけではありませんが、このプロトコルに従って実装された諸々を便宜的に Nostr と呼びます。

メール等の登録が不要でアカウントを作成すると公開鍵と秘密鍵が発行されます。
お手軽な反面、秘密鍵が漏れるとアカウントの復帰手段がなかったりスパム対策が難しかったりするので Twitter の後継にはならないと思いますが割り切った仕様で(個人的に最近 WebSocket をやっているのもあって)技術的に面白いと思ったので触ってみています。

詳細はこちらの記事が分かりやすいです。

https://qiita.com/gpsnmeajp/items/77eee9535fb1a092e286

クライアントからクライアントへデータを中継するリレーサーバーで成り立っており、あらゆるデータをクライアントへ送りクライアント側でフィルタしてタイムラインを構築します。
クライアントはリレーが死んでもいいように複数のリレーへ接続して冗長化します。
複数のリレーからあらゆるデータが送られてくるので通信量がすごいです。
回線には気を付けてください。

調べたことは随時ここにまとめています。
認証バッジ以外のことも知りたかったら覗いてみてください。

https://zenn.dev/snowcait/scraps/6dfe34c4ac6709

認証バッジ

さて本題です。
Nostr にも Twitter のような認証バッジがあり DNS ベースの認証ができます。
とはいえそのドメインに登録していることしか証明できないため本人確認とは言いがたいです。

仕様は NIP-05 Mapping Nostr keys to DNS-based internet identifiers にまとまっています。
自分のサーバーに /.well-known/nostr.json をホストすれば OK です。
ただみんなが自分のサーバーを持っているわけではないと思うので GitHub Pages を利用して無料でホストする方法を紹介します。
GitHub アカウントを所有して運用している方であれば本人確認としてもある程度有用そうです。

GitHub Pages で nostr.json をホスト

基本的にこちらに記載されている通りです。
デフォルトで適用される Jekyll は隠しフォルダ(. 始まりのフォルダ)をホストしないので .nojekyll ファイルを作成するのを忘れないようにしてください。

https://zenn.dev/ihasq/articles/52b525c7579c64

GitHub アカウント作成

GitHub に登録していない方はアカウントを作成してください。
私は SnowCait という名前で登録しているので以後そちらを例とします。
適宜ご自身の名前に置き換えてください。

リポジトリ作成

SnowCait.github.io という名前のリポジトリを作成します。
これは特別な名前で https://snowcait.github.io 直下にホストしてくれます。
(通常は https://snowcait.github.io/<リポジトリ名> になる)

.nojekyll 作成

最初にも書きましたが .nojekyll の作成を忘れないようにしてください。
隠しフォルダをホストするために Jekyll をオフにします。
中身は空で構いません。

今回は /docs 配下をホストするので /docs/.nojekyll に作成しました。
/ 配下をホストする場合は /.nojekyll になります)

Jekyll を使いたい場合

.nojekyll を作成する代わりに _config.yml に設定を書きます。

/docs/_config.yml
include: [".well-known"]

https://github.com/SnowCait/SnowCait.github.io/blob/main/docs/.nojekyll

nostr.json 作成

/docs/.well-known/nostr.json を作成します。
/ 配下をホストする場合は /.well-known/nostr.json になります)

/docs/.well-known/nostr.json
{
  "names": {
    "ユーザー名": "Hex 公開鍵"
  }
}

ユーザー名を _ にしておくとドメインだけの表示になるみたいです。
Hex 公開鍵は Iris だとアカウント設定の Copy hex で取得できます。

https://github.com/SnowCait/SnowCait.github.io/blob/main/docs/.well-known/nostr.json

GitHub Pages の設定

リポジトリの Settings > Pages で /docs をホストするように設定します。

これで https://snowcait.github.io/.well-known/nostr.json にアクセスできるようになります。

クライアントの設定

プロフィールの NIP-05 のところに SnowCait@snowcait.github.io を設定します。

これで認証バッジが表示されるようになりました。

補足: GitHub Pages 以外でのホスト

クライアントから参照するときは https://<domain>/.well-known/nostr.json?name=<local-part> という URL でアクセスされます。
1 つのドメインに複数ユーザーが登録することを想定しているようです。
name がクエリパラメーターになっていることで GitHub Pages のような静的ホストサーバーは JSON の names に複数のユーザーのデータを返せるようになっています。
ただしユーザー数が増えてくるとデータ量が大きくなるので動的に返せるサーバーは name で指定されたユーザーのデータだけを返すのが良さそうです。
CORS の設定も忘れないようにしてください。(GitHub Pages は Access-Control-Allow-Origin: * になっています)

Discussion