Web アプリとマジックリンクの組み合わせはなかなか難しいと思った話。

(Firebase 使用中に遭遇したのでそれをベースに書いていますが Firebase に限った話ではありません)

Firebase にはメールリンク認証という機能があります。これはいわゆるマジックリンク(ユーザーのメールアドレスにログイン用メールを送ることでログインさせる)方式のログインです。

パスワードを記憶する必要がないので便利ですね。開発者目線で言うと、パスワードを管理する必要がないので嬉しいです。パスワードリセット機能なども考えなくて良くなります。

Firebase のドキュメントでも次のように利点が語られています。

メールでのログインには、次のような利点があります。

  • 登録とログインが簡単。
  • アプリ間でパスワードが再利用されるリスクが低い。パスワードを再利用すると、適切なパスワードを選択していても、セキュリティが低下する可能性があります。
  • ユーザー認証で、ユーザーがメールアドレスの正当な所有者であることも確認できる。
  • アクセス可能なメール アカウントがあればログインできる。電話番号やソーシャル メディアのアカウントを所有する必要はありません。
  • パスワードを入力(あるいは記憶)しなくても、安全にログインできる。モバイル デバイスでは、パスワードの入力や記憶が面倒な場合があります。
  • 前にメール ID(パスワードや認証連携)でログインしたユーザーをメールのみによるログインにアップグレードできる。たとえば、パスワードを忘れてしまった場合、パスワードを再設定しなくてもログインできます。

https://firebase.google.com/docs/auth/web/email-link-auth

特に最後の一文で「前にメール ID(パスワードや認証連携)でログインしたユーザーをメールのみによるログインにアップグレードできる。」と書かれているあたり、マジックリンクは他のログイン方法より優位だと言っているようにも見えます。

マジックリンク + Web アプリ + モバイル の組み合わせが問題

ユーザは自分のメールアドレスに届いたメールを開き、本文中に記載されているリンクを開きます。これによりアプリへ遷移してログインが完了します。

さて、このときアプリがどのブラウザで開かれるかが問題になってきます。

PC で操作しているユーザの場合、大抵は PC のデフォルトブラウザに設定されているブラウザでアプリが開かれます。これは全く問題ありません。

懸念すべきはモバイルのユーザです。モバイルのメーラーアプリにてメールを開き、本文中のリンクを押したときにはどのブラウザで開かれるでしょうか。これは以下のケースのどれかになるはずです。

  • Chrome や Safari といったモバイル標準ブラウザで開かれる。
  • どのブラウザで開くか選択するポップアップをメーラーが表示する。
  • メーラーのアプリ内ブラウザで開かれる。

問題になるのが最後のケースです。

まず、ほとんどのアプリにおいて自動ログイン機能が実装されていると思います。ローカルストレージや Indexed DB や Cookie になんらかのデータを保存しておき、次回からは自動的にログインできるようにしておきます。

メーラーのアプリ内ブラウザで最初にアプリを開いたユーザが翌日またアプリを開くときにはどのブラウザを使うでしょうか。大抵は Chrome や Safari といった標準ブラウザで開くと思いますが、このとき自動ログインは機能しません。

ローカルに保存するデータはブラウザ単位での保存になるため、メーラーアプリ内ブラウザのデータと標準ブラウザのデータは共有されないためです。

そのため、ユーザは改めてログインする必要があります。そしてマジックリンクのメールが送られます。そしてそれがメーラーのアプリ内ブラウザで開かれるとしたら…という堂々巡りが発生します。

この結果、マジックリンクをメーラーアプリ内ブラウザで開く限り、毎回ログイン作業が求められることになってしまいます。

これを解消するには、なんとかしてマジックリンクを標準ブラウザで開いてもらうほかありません。どのブラウザで開くか選択させるメーラーならまだしも、そうでないものの場合、リンクの文字列をコピーして改めて別のブラウザに貼り付けるという作業をすることでしか回避できません。

なお一度自動ログインが機能しだしたとしても、どこかでログアウトしてしまうとユーザには改めてこの作業をやってもらうことになります。

さすがに文字列をコピーさせるのは論外としても、メーラー外ブラウザで開くようユーザに求めることが、はたしてサービスとして許容できるのかは難しいところです。

ネイティブアプリの場合ならば、マジックリンクを押したときにインストールしているアプリを開くことになるので、メーラー内ブラウザ問題に悩まされることもないのですけどね。意外なところに Web アプリの制約があったものだなと感じました。