2.7 KiB
title, slug, date, tags, draft
title | slug | date | tags | draft | |
---|---|---|---|---|---|
oauthに対応した | oauth | 2025-06-19 |
|
false |
現在、syu.isにatprotoを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',
});