Files
log/my-blog/content/posts/2025-06-19-oauth.md
2025-06-19 22:08:43 +09:00

2.7 KiB

title, slug, date, tags, draft
title slug date tags draft
oauthに対応した oauth 2025-06-19
atproto
false

現在、syu.isatprotoをselfhostしています。

oauthをbsky.social, syu.isともに動くようにしました。

ここでいうselfhostは、pds, plc, bsky, bgsなどを自前のserverで動かし、連携することをいいいます。

ちなみに、atprotoはblueskyのようなものです。

ただし、その内容は結構複雑で、at://didの仕組みで動くsnsです。

usernameはhandleというdomainの形を採用しています。

didの名前解決をしているのがplcです。pdsがuserのdataを保存しています。timelineに配信したり表示しているのがbsky, bgsです。

oauthでハマったところ

現在、bsky.teamのpds, plc, bskyにはdid:plc:6qyecktefllvenje24fcxnieが登録されています。これはsyu.is@ai.syui.aiのアカウントです。

$ did=did:plc:6qyecktefllvenje24fcxnie

$ curl -sL https://plc.syu.is/$did|jq .alsoKnownAs
[ "at://ai.syui.ai" ]

$ curl -sL https://plc.directory/$did|jq .alsoKnownAs
[ "at://ai.syu.is" ]

しかし、みて分かる通り、pds, plcは@ai.syu.isで登録されており、handle-changeが更新されていないようです。

$ handle=ai.syui.ai
$ curl -sL "https://syu.is/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did
$ curl -sL "https://bsky.social/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did
$ curl -sL "https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did

oauthは、そのままではbsky.teamのpds, plcを使って名前解決を行います。この場合、まず、それらのserverにdidが登録されている必要があります。

次に、handleの更新が反映されている必要があります。もし反映されていない場合、handleとpasswordが一致しません。

localhostではhandleをdidにすることで突破できそうでしたが、本番環境では難しそうでした。

なお、@atproto/oauth-providerの本体を書き換えて、pdsで使うと回避は可能だと思います。

私の場合は、その方法は使わず、didの名前解決には自前のpds, plcを使用することにしました。

this.oauthClient = await BrowserOAuthClient.load({
        clientId: this.getClientId(),
        handleResolver: pdsUrl,
        plcDirectoryUrl: pdsUrl === 'https://syu.is' ? 'https://plc.syu.is' : 'https://plc.directory',
});