{
  "$type": "com.whtwnd.blog.entry",
  "blobs": [
    {
      "name": "画像 3.jpg",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreibkfy6h5skzbagid4vgcqkoeyibgz4hks46uhnq6a4u4lja2ivsle"
        },
        "mimeType": "image/jpeg",
        "size": 98309
      },
      "encoding": "image/jpeg"
    },
    {
      "name": "画像 3.jpg",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreihdc53oteup7vmpv5azqalwv3pvc4segfzdoo22uizpobkjwd7awm"
        },
        "mimeType": "image/jpeg",
        "size": 95925
      },
      "encoding": "image/jpeg"
    },
    {
      "name": "画像 5.jpg",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreielsxc4o4wlxgsxp2xsstdj6hgdvovmdqzvvgv5a224rhlyjz2ogi"
        },
        "mimeType": "image/jpeg",
        "size": 171368
      },
      "encoding": "image/jpeg"
    },
    {
      "name": "画像 5.jpg",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreibn3xdbbulintwbfpbe6kx4bm3jxvckrpe4a43kgfje4qhurfbopq"
        },
        "mimeType": "image/jpeg",
        "size": 169940
      },
      "encoding": "image/jpeg"
    },
    {
      "name": "ScreenShot 2026-01-18 21.09.55.png",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreihtmhhfuiffmyv5jd6cjzlwpui3zibzoanb6ccgmwxm2b4kq3x7am"
        },
        "mimeType": "image/png",
        "size": 352719
      },
      "encoding": "image/png"
    },
    {
      "name": "ScreenShot 2026-01-20 1.23.08.png",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreifdxkop3k2iv7ln2u7z4i6l32bfwrpo4odmseufcmtmoebscv6g7y"
        },
        "mimeType": "image/png",
        "size": 80266
      },
      "encoding": "image/png"
    },
    {
      "name": "Bluesky-OAuth-Button.svg",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreiecirmhid2grndzdgpc5gjkclfju47twt6dd7wfxlnukhtqutu7py"
        },
        "mimeType": "application/xml",
        "size": 9845
      },
      "encoding": "image/svg+xml"
    },
    {
      "name": "Bluesky-OAuth-Button@3x.png",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreign6wxckzwiwgw73eroino3qfqhkxmt43ekx4n4rkqjxzg7otyze4"
        },
        "mimeType": "image/png",
        "size": 5183
      },
      "encoding": "image/png"
    },
    {
      "name": "Bluesky-OAuth-Button (1)@2x.png",
      "blobref": {
        "$type": "blob",
        "ref": {
          "$link": "bafkreic4vjxfa42hlw3vqhizek7g6akrcmvokytp2amobaxuy5yyzm32ru"
        },
        "mimeType": "image/png",
        "size": 7295
      },
      "encoding": "image/png"
    }
  ],
  "theme": "github-light",
  "title": "AppPasswordとOAuthについておさらい",
  "content": "以前、**びるず[@bills-appworks.blue](https://bsky.app/profile/did:plc:lfjssqqi6somnb7vhup2jm5w)** さんがアプリパスワードとOAuthの違いについて、以下の記事を書いてくれていました。\n\n\n**[OAuthとアプリパスワード @bills-appworks.blue](https://whtwnd.com/bills-appworks.blue/3lyvtejbyy52m)**\n\n\nアプリパスワード(AppPassword)とOAuthの違いについては上記記事を参考にしてください。\n\n\nこの記事では、Blueskyには何故アプリパスワードを使うアプリとOAuthを使うアプリがあるのかについて軽く触れてみます。\n\n## Blueskyのサードパーティアプリには2つの認証方法がある\n\nBluesky関連のサードパーティアプリやクライアントは多数出てきています。\nこれらのアプリでは大きく2種類の方法でアカウントの認証が行われています。\n\n![OAuth vs AppPassword](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreihdc53oteup7vmpv5azqalwv3pvc4segfzdoo22uizpobkjwd7awm)\n\n1. **AppPassword** (アプリパスワード)\n2. **OAuth** (オーオース)\n\n何故2つの認証方法があるのか。そしてそれぞれ違っており分かりづらい。という声も見かけました。\nたしかに、アプリによってどちらを使うか(あるいは両方使えるケースも)あって分かりづらいの現状です。\n\n\n## 歴史的背景\n\n### BlueskyのリリースとAppPasswordの登場\n\nBlueskyは当初からサードパーティアプリ向けに認証方法にOAuthを導入することを検討していました。OAuthはアカウントの情報を安全に扱えるので、いまではBluesky以外のWeb全体でも多くの利用された方法です。\n\nしかし、この認証方式を導入するにはどうしても時間がかかります。それだけでなく始まったばかりのBlueskyには他に急いで取りかかるタスクも多くあり、OAuth実装に割く時間がありませんでした。\n\nそこでユーザーの実パスワードを使用せず、暫定的に安全にアプリを利用できるようにするアプリパスワード方式を作り、提供しました。\n\n![Login with Bluesky AppPassword](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreibn3xdbbulintwbfpbe6kx4bm3jxvckrpe4a43kgfje4qhurfbopq)\n\n\nアプリパスワードは、本パスワードとは別に、アプリ毎に使用する使い捨てパスワードの様なものを発行し、それでアプリからログインできるようにしよう。というものです。\n\n権限の違いなどもありますが、そこは冒頭の記事を参照してください。\n\nこれによって、Bluesky初期には多くの開発者が作成したアプリケーションを利用者は安全に利用することができるようになりました。\n\nしかしアプリ毎に異なるパスワードを管理して運用するには、利用者の管理負担が大きくなります。\n\n\n### OAuthの準備と登場\n\nBluesky本体の様々な実装がある程度進み、OAuth実装に取り組める準備ができました。\n\nBlueskyという分散型サービスで扱うためのOAuth認証の策定と実装が進み、2024年9月頃になり仕様やドキュメントが公開されたのがされるようになりました。\n\nしかし既存の一般的なOAuthとも少し仕様が異なる部分もあり、この時点の最初の頃はまだAppPasswordを採用するアプリも多かったですが、以降しばらくしてからのBlueskyアプリはOAuthを採用したものが徐々に増えてきました。\n\n### アップデートとサポート\n\n古くからあるアプリでもアプリパスワードからOAuthに変更したアプリ、あるいは慣れ親しんだアプリパスワード方式を残しつつOAuth方式をサポートしているアプリもあります。\n\nしかし古いままアップデートされていないアプリはアプリパスワード方式しかサポートしていないケースもあります。\n\n\n今後についてはアプリパスワード方式もBlueskyがサポートを停止してOAuthに転換していくと、AppPassword方式は利用できなくなっていくでしょう。\n\n\n\n## OAuth利用時にハンドルの入力が必要な理由\n\nOAuthで認証するときに、AppleやGoogle、Microsoftなどのサービスであれば「**Signin with 〜**」や「**○○でサインイン**」と書かれたボタンをクリックするだけでログインできます。\n\n![Sign-in with Bluesky button](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreic4vjxfa42hlw3vqhizek7g6akrcmvokytp2amobaxuy5yyzm32ru)\n画像はサンプル\n\n\nしかし、Blueskyのアプリではまずハンドルを入力するケースが多いです。\n\nこれは何故かというと、Blueskyが分散型SNSであることに起因します。\n\n認証はユーザーのアカウントが存在しているサーバーに対して問い合わせを行います。\nしかしBlueskyは(正しくはAT Protocolでは)分散型であるが故に、アカウントがどのサーバー(PDS)にあるかを探す必要があります。\nその手がかりとなるのがハンドルです。\n\n\n\nまずハンドルからユーザーのサーバーを特定し、そのサーバーに対してOAuthでログインする旨を通信します。ここから初めてOAuth認証の処理が動くことができます。\n\n\n## 認証方法ごとの違いについて\n\n### アプリパスワード\n\nアプリパスワードはアカウントを使用する際に要求する権限の細かな指定ができません。\nアプリパスワードを利用してログインすると、開発者は\n- ユーザーのアカウントを通じてBlueskyで利用できるほとんどの機能(設定やセンシティブな情報を除く)を利用できる\n- 上記に追加でDMの読み書き権限を追加する(アプリパスワードの画面で選択可能です)\n\n例えば、ログインしてプロフィールを使用するだけのアプリケーションでもあなたのタイムラインを読み書きしたり、他のアカウントをフォローできる権限を有している状態です。\n\nさらに、なるべくアプリ毎に発行されたパスワードを使用し、管理する必要性が出てきます。\n\n![アプリパスワード発行画面](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreifdxkop3k2iv7ln2u7z4i6l32bfwrpo4odmseufcmtmoebscv6g7y)\n\n### OAuth\n\n開発者は接続するアプリに必要な権限だけを要求することができます。\n現在のところはアプリパスワードとほとんど同じ権限を要求して利用しているアプリも多いですが、明確に指定しているアプリもあります。\n\n利用者はOAuthでログイン時に表示される確認画面で、各アプリがどのような権限を要求しているか確認することができます。\n\n自分が利用しようとするアプリが過剰に権限を要求していないか(目的に沿っているか)を事前に確認することができます。\n\n![SomekeSignalのOAuth承認確認画面の例](https://oyster.us-east.host.bsky.network/xrpc/com.atproto.sync.getBlob?did=did%3Aplc%3Ac22jdrqhoajyj5ca7e56a3ke&cid=bafkreihtmhhfuiffmyv5jd6cjzlwpui3zibzoanb6ccgmwxm2b4kq3x7am)\nイベントの参加可否を表明、確認できる [SomekeSignal](https://smokesignal.events)のOAuth画面の例。ユーザーは確認画面の?をクリックして求められる権限の詳細を、事前に確認することができます。\n\n\n\n\n## 結局どっちが良いの\n\n段階的な導入なので良い悪いはないですが、どちらかと言えばOAuthの方が良いです。\n\n開発者視点としては、必要最小限の情報と権限だけ要求し、余計な事ができない方が明確で良いです。もし万が一アプリに脆弱性があって、自分のアプリ経由で意図せずおそろしい操作(例えば、すべての投稿が消せてしまう、パスワードをリセットできてしまうなど)ができてしまった場合、責任が取れません。\n(2026年1月の現時点では、合理的に制御する方法が確立できていないため、意図せず権限を過剰に要求してしまっているアプリもあります)\n\n\n\n利用者視点でも、これから利用しようとするアプリがどのような権限を要求していて、どのような操作をしようとしているのかを、事前により細かく明確に権限を確認できます。\n\nまた、既にログイン済みアカウントの場合はパスワード入力を省略できるます。\n\n上記理由により、総合的にはOAuthの方が良いです。\n\n\n\nOAuthは今後充分な移行期間を経て移行していき、[最終的にはApp Passwordは非推奨とされる](https://github.com/bluesky-social/atproto/discussions/2656)流れになるようです。\n\nそのため、将来的にはOAuthのみに統合されていくと思われます。\n\n\n## 最後に\n\nBlueskyはまだSNSとして、そしてその土台作りと併せて始まったばかりの新しいプラットフォームです。\nそのため、今までにはない仕組みがあったり魅力的な部分もありつつ、変化の激しいプラットフォームでもあります。しばらく使っていないうちに新しい機能、新しい仕組みがドンドン取り込まれていきます。\n\nしばらくぶりだと変化が大きくてビックリしますが、毎日使っていればその差も僅かです。\n毎日使って慣れていくのもいかがですか?\n\n最近また少しずつアクティブな利用者も増えつつあります。この機会にたくさん使っていきましょう!\n",
  "createdAt": "2026-01-21T07:50:53.151Z",
  "visibility": "public"
}