diff --git a/my-blog/content/posts/2025-12-04-atproto.md b/my-blog/content/posts/2025-12-04-atproto.md new file mode 100644 index 0000000..31aad71 --- /dev/null +++ b/my-blog/content/posts/2025-12-04-atproto.md @@ -0,0 +1,106 @@ +--- +title: "atprotoでozoneを動かした" +slug: "atproto" +date: "2025-12-04" +tags: ["atproto"] +language: ["ja", "en"] +draft: false +--- + +最近は、atprotoとai.card(ios)の連携を作っていました。ozoneが必要そうになったので動かしてみます。 + + +## atprotoをゲームアカウントに + +ゲームのアカウントシステムを作る際、atprotoが便利だと思っています。独自にシステムを作るのではなく、既にあるものを使って構築します。 + +しかし問題もあります。atprotoはユーザーがデータを自由に書き換えられます。もちろん、知識があればですが、そう難しいことではありません。 + +そのため、ゲームのアカウントシステムとして使う場合、ユーザーがデータを改ざんできないようにする必要があります。これは、rustで書いた独自のシステムと連携し、ユーザーに一部のデータしか操作できないuuidを発行することで解決することにしました。 + +## ゲームアカウントの仕組み + +ゲームアカウントの仕組みは非常にシンプルです。 + +1. [新規登録] handleを入力すると自動でアカウトが作成される +2. パスワードは自動生成され、dbに保存。ユーザーには表示しない +3. uuidを発行し、それを用いてユーザーはsessionを復元できる + +この仕組みをiosアプリに実装することで、ゲームデータの改ざんを防止するアカウントとして利用します。 + + + +## ゲームアカウントの特典 + +私はゲームデータが改ざんされるとは考えていません。知識を持った大半も、そんな面倒なこと普通しません。ほとんどの人は普通に遊ぶだろうと考えています。 + +とはいえ、それも楽しみ方も一つとして許容する気持ちもあります。 + +また、改ざんされたとしてそれで壊れるような仕組みではいけません。ですからそれをされてもいいようゲームを構築しなければいけません。要は前提をどう考えるかです。 + +私が作っているゲームはai.cardが改ざんできないローカルデータのみを扱い、ai.rseはリモートデータを使うという構造です。したがって、改造もai.rseでしか有効ではありません。 + +そのため、結果としてより重視されるのはai.cardの方になるだろうと思っています。ai.rseはおまけみたいなものと認識されるのでは。 + +ai.rseでのデータの扱いは以下のような形になります。 + +私のpdsのアカウントはゲームデータ改ざんがないものとみなし + +1. maxの値を通常アカウントより大きく設定 +2. {user}.syu.isのドメイン部分を省略して表示 + +## ozoneの導入 + +そうなるとユーザー管理も大変なので、ozoneがあったほうが良いと判断し、ozoneを動かしてみることにします。 + +### backend, frontend + +ozoneはback, frontの2つがあり、これらを動かす必要があります。 + +- [https://github.com/bluesky-social/atproto/tree/main/services/ozone](https://github.com/bluesky-social/atproto/tree/main/services/ozone) +- [https://github.com/bluesky-social/ozone](https://github.com/bluesky-social/ozone) + +```md +1 ozone /xrpc/* :2585 +2 ozone /.well-known/* :2585 +3 ozone * :2586 +``` + +このようにすればよいでしょう。 + +### atproto_pds + +注意書きがあり、通常のアカウントは好ましくないようです。 + +`AtprotoPersonalDataServer` + +```diff +diff --git a/lib/identity.ts b/lib/identity.ts +index a8ec3a7..8e4d171 100644 +--- a/lib/identity.ts ++++ b/lib/identity.ts +@@ -83,7 +83,7 @@ export function didDocToData(doc: { + const [, id] = s['id'].split('#') + acc[id] = { + type: s['type'], +- serviceEndpoint: s['serviceEndpoint'], ++ endpoint: s['serviceEndpoint'], + } + } + return acc +``` + +その他のpatchはこちらが参考になります。 + +- [https://github.com/itaru2622/bluesky-selfhost-env/tree/master/patching](https://github.com/itaru2622/bluesky-selfhost-env/tree/master/patching) + +### user verify + +```sh:envs/ozone +OZONE_VERIFIER_URL=https://{PDS} +OZONE_VERIFIER_DID=${ADMIN_DID} +OZONE_VERIFIER_PASSWORD=${APP_PASSWORD} +``` + +[![](/img/atproto_ozone_0001.png)](/img/atproto_ozone_0001.png) + diff --git a/my-blog/static/img/atproto_ozone_0001.png b/my-blog/static/img/atproto_ozone_0001.png new file mode 100644 index 0000000..586fc56 Binary files /dev/null and b/my-blog/static/img/atproto_ozone_0001.png differ