はじめに

マストドンでログインをRailsで実装するを使ってWebサービスを実装中に発見されたomniauth-mastodonの不具合と、その対応内容についてまとめました。

マストドンでログインの流れ

マストドンでログインの流れは以下のようになります。

Mastodon Login

①最初にこのようなダイアログが表示され、username@domain を入力してLoginをクリックします。

Mastodon Login2

②すると入力したdomain のインスタンスのログイン画面に遷移するのでメールアドレスとパスワードを入力してログインすればコールバックを設定した画面に返ってきます。

③返ってきた画面ではインスタンスから取得した各種値の中でもprovider とuid をキーとしてデータの存在をチェックして、存在しなければ新規作成を行います。provider には認証を提供しているサービス名を表す文字列が入ります。マストドンなのでmastodon が、uid にはサービス内で一意の値が入ります。マストドンはインスタンスごとの管理となっているのでusername@domain となります。

不具合内容

uidとして返ってくるのは①の画面で入力したusername@domainなのですが、認証は②の画面で行われ、必ずしも①で入力したusernameでログインしなければいけないわけではありません。

例えば①でuser1@domain と入力して②でuser2 のメールアドレスとパスワードでログインしたらuidにはuser1@domain が返ってきてしまいます。これではアカウントの管理ができません。

対応内容

本家のGitHubを見てみるとこの問題に対するプルリクエストが挙がっていてマージされていました。

ですがその修正内容はuidの中身をusername@domain からid に変更するというものでした。これだとインスタンスが違えば重複が発生するのではないかという疑問と、実装中のWebサービスはusername@domainの形式が来ることを期待しているという都合もあってそのまま使うことが出来ませんでした。

なのでForkしてuidの中身を②でログインしたユーザーのusername@domain を返すよう変更しました。

gem 'mastodon-api', require: 'mastodon', github: 'tootsuite/mastodon-api'
gem 'omniauth-mastodon', github: 'ezaki3/omniauth-mastodon', branch: 'change-uid'
gem 'omniauth'

でインストールすることが出来ます。