せっかくWebmentionと連携できるのに、自サイトからトゥートできない。こんな世の中じゃぁ……。というわけで調べてみました。

結論は、まだわかりません。

なぜか世の中にTootボタンがない

ツイートボタンはTwitterが提供している。でも、トゥートボタンはマストドンのインスタンスで提供されていない。少なくとも私は見たことがない。なんでや!

Tootボタンはない

下記URLでブラウザ拡張という形で紹介されていた。が、リンク切れ。

とりあえずAPIがあればそれを叩いてトゥートできるはず。ボタンだって自力で作れるのでは? すでにマストドン登場から何年も経っているのに存在しないってどういうこと? なにか事情があるのだろう。わというわけで、ググってた。

APIでログインする方法?

これを参考にしてみた。どのAPIをどう叩けばログインできるのかがわかる、はず。でもチンプンカンプン。API以前にログインする仕組みがわからんので調べた。

OAuth 2.0

ログインするにはOAuth2.0という仕組みを使っているようだ。

Webアプリ開発者がエンドユーザにログインを提供する方法はおもに4つあるらしい。

方法(権限委譲) 開発者 ユーザ
Authorization Code コードを返すサーバが必要 しばしば6桁の数字をコピペする作業を要する
Implicit トークンを返すサーバが必要 おそらくパスワードの送信が必要
Password ユーザの代わりにAPIでトークンを取得する パスワードを開発者に知られてしまう
Client Credentials ユーザの代わりにAPIでトークンを取得する 認証できない

よくわからない。これであっているのか?

とにかく、ちゃんとやるには専用サーバが必要らしい。

もし私が開発するなら、サーバも運用したくないし、エンドユーザのパスワードも管理したくない。私はただ、エンドユーザに好きにトゥートさせたいだけ。全部だれかにやってほしい。はたして、そんな仕組みを作ることができるのか。

クライアント

JavaScriptからMastodon APIを叩くクライアント・ライブラリをググってみた。

ログインするとき、どちらもAccessTokenが必要らしい。このAccessTokenをどう取得するかが問題。それが上記の4つの方法なのだと思われる。ただ、安全にやりとりするには専用サーバが必要。私にそれをやるカネも知識も技術もない。クライアントだけでやりたい。となると、次のような方法が考えられる。

ユーザが各自インスタンスからトークンを取得する

エンドユーザにトークンを取得してもらえばいい。ちょっと面倒くさいが、これで私はサーバもパスワード保管もしなくていい。

  1. Masotdonの各インスタンスでアカウントを作る
  2. ログインする
  3. 設定画面へ行く
  4. 開発新規アプリをクリックする mstdn.jp, pawoo.net
  5. アプリの名前, アプリのウェブサイト, アクセス権を適当にセットして送信する
  6. 出現したアクセストークンをどこかにメモっておく(他人に知られないように)

megalodonなどのクライアントでは、ここで取得したアクセストークンを渡してやることでトゥートなどができるようになる。

なら、あとは私がどうにかしてユーザからアクセストークンを受け取り、代わりにマストドンAPIを叩いてトゥートできるコードをJavaScriptで実装すればいい。そうすればユーザのブラウザ内だけでAPIを叩くことになり、アクセストークンを誰にも知られずに済むはず。

ただ、問題がある。

アクセストークンをどう保存するか

以下のような方法がある。

  • Cookie
  • LocalStorage
  • IndexedDB

これらはすべてブラウザの機能であり、ユーザがローカルに保存する方法だ。私はサーバ運用なんてできないし、まして誰かの個人情報を管理するなんて重責を負いたくない。よって各自ローカルで管理してもらいたいから、これらの方法になる。

だが、いずれにせよドメイン単位でしか保持できない。けれどマストドンのトークンは他のドメインでも使うかもしれない。なのでエンドユーザ単位で保持したい。もしこれを実現できる方法があるとしたら?

  • ブラウザ拡張機能

ブラウザ拡張機能を実装すればいい。mpurseみたいに。でも大変そう。きっと誰かがとっくに作っているはず。ググってみるとトゥートするブラウザ拡張があったようだ。が、すでにリンク切れになっていた。

ほかにも共有ボタンなどもあったらしいが、ことごとくリンク切れである。

マストドンの開発でもissueがあがっているが、進展はない。

たぶんマストドン公式がやるならAuthorization Codeの方法になるのだろう。でもそれにはインスタンスとして稼働しているサーバに負荷をかけることになりそう。きっとそういう懸念もあって進んでいないんじゃないかと勝手に妄想した。

いずれにせよ、他力本願にも限度があるらしい。

私はどうするか

私のサイトのURLを入れてトゥートするとWebmention APIでそのトゥート内容を取得してサイトに表示できる。それはいいのだが、私のサイトで直接トゥートできないのが不満だ。現状、mstdn.jppawoo.netの各インスタンスからトゥートしてもらうしかない。この不便さをなんとかしたい。マストドンAPIを使えば不可能ではないだろう。アクセストークンさえあればAPIを叩けるはずだから。

  • ytyaru.github.ioドメイン内限定でアクセストークンをローカル保存する

という方法にしちゃおう。とりあえずの実験ということで。

  1. ユーザがトゥートボタンを押す
  2. ユーザにアクセストークンを入力させる(トークンは各自で取得してもらう)
  3. トゥートする内容を入力させる
  4. トゥートするボタンを押させる
  5. マストドンAPIでトゥート投稿する
  6. 成功したらアクセストークンをLocalStorageで保存する
  7. 失敗したらその旨を伝え、APIのレスポンスもそのまま表示する

次のような考慮が必要そう。

  • 2回目以降はアクセストークンの入力を省略できるようにする
  • けど、保存されたアクセストークンはいつでも削除・変更できるようにしておく

気になっていることがある。

  • 文字数制限500字を超えないようにする
    • 絵文字などは1文字としてカウントできない問題とかあると見た気がする。どうしよう
  • 画像投稿の実装などは大変すぎるしコメントの主旨から外れるためやらない

トゥート画面に似たようなものまで作らなきゃいけない。これめちゃくちゃ大変じゃないか。手抜きしないと終わらなそう。ほかにもまだまだ考えるべきことがある。

考えるべきこと

アクセストークンをいくつ保存するか

アクセストークンはたくさん作れる。ユーザは好きなように管理できる。

  • ユーザごと
  • 権限ごと
  • 用途ごと

けれどたくさんあったら、すごく複雑な管理になってしまう。実装もつらい。極力シンプルにしたい。

最小構成

最低でもインスタンスごとにひとつは必要。

私のサイトでWebmention連携すべくbrid.gyで連携しているのはmstdn.jp, pawoo.netの2インスタンスのみ。なので、それぞれのインスタンスにひとつのアクセストークンをもたせるようにするのが最小構成である。

マルチ・デバイス

LocalStorageはブラウザごとに保存される。もしPCやスマホなど複数あったとしたら、マシンごとに入力しなければならない。そして、アクセストークンはそれぞれのデバイスのディスクに保存されることになる。

できれば、どのデバイスでも特定のアカウントでログインできるようにしたかった。それならブラウザのパスワード管理に丸投げできる。結局それも各デバイスのディスクに保存されるが、そちらのほうが安全・安心だった。けれどその仕組みを作るにはバックエンドのサーバが必要なため断念する。保存だけならブラウザでできるが、ログインする仕組みがね。

もしかしたらOAuth 2.0ログインサーバ機能を提供している外部サービスを利用すれば可能かもしれない。たとえばGitHubとかGoogleとか。けど、それらのAPIをも勉強しなきゃいけなくなる。一体いつになったらトゥートできるようになるのか。ログイン部分にそこまで力をかけたくない。まずはトゥートAPIで本当にトゥートできるのか確かめたい。

所感

まさかログインまわりを調べるだけでこれほど大変だとは。一体いつになったらAPIでトゥートできるんだ。本当にできるのか? 動くコードよこせ。というわけで、次はコード書く。もう絶対コード書く。

モナコインのことも調べたいのに。先が長すぎる。