From a970bc008f6b40869ff05b8dc848c0fcc9d42906 Mon Sep 17 00:00:00 2001 From: syui Date: Thu, 4 Dec 2025 14:35:17 +0900 Subject: [PATCH] fix --- my-blog/content/posts/2025-12-04-atproto.md | 106 ++++++++++++++++++++ my-blog/static/img/atproto_ozone_0001.png | Bin 0 -> 338737 bytes 2 files changed, 106 insertions(+) create mode 100644 my-blog/content/posts/2025-12-04-atproto.md create mode 100644 my-blog/static/img/atproto_ozone_0001.png 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 0000000000000000000000000000000000000000..586fc56a84309ea6a947a99edcf01c6767cf4a91 GIT binary patch literal 338737 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