omniauth-mastodonをForkしてカスタマイズ
はじめに
マストドンでログインをRailsで実装するを使ってWebサービスを実装中に発見されたomniauth-mastodonの不具合と、その対応内容についてまとめました。
マストドンでログインの流れ
マストドンでログインの流れは以下のようになります。
①最初にこのようなダイアログが表示され、username@domain
を入力してLoginをクリックします。
②すると入力した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'
でインストールすることが出来ます。