こんばんは、ritouです。
今日はこの機能を使ってみましょう。
/#bosyu をメールアドレス✉️で
— bosyu公式 (@bosyu_me) 2020年7月27日
ご利用いただけるようになりました!
\
今まで、TwitterかFacebookのアカウントがないとご利用いただけませんでしたが、メールアドレスだけでも使えるようになりました。
より多くの方に、bosyuしたり応募していただければうれしいです☺️#bosyu開発室 pic.twitter.com/46zCST53Kg
何の話?
medium が前から採用していた方式です。
これを新しい方式と捉えるかどうか、個人的にはそれほど新しくは感じません。
長年の歴史からいわゆる「パスワード認証を用いた登録や認証フロー」には人類の持つ脆弱性への対策として必ずメールやSMSによるリカバリーがセットになって実装されている。見方を変えると二つの認証方式があったところから「パスワード認証」を取り除くと今回の形になると言えるだろう。 https://t.co/7LW5jAUkrZ
— 👹秋田の猫🐱 (@ritou) 2020年7月27日
メアドでリカバリー手段を確保しつつパスワードを設定させるのが現状一般的な「パスワード認証を用いた登録フロー」だとしたらそこからパスワード設定を抜いたものがメアドによる新規登録フローと言えるでしょう。 また、パスワードを忘れた際にメアドでリカバリーする処理を認証フローとして使うことで「パスワード認証を用いた認証フロー」からパスワードの検証を取り除いたものと考えることができます。いつだったかのbuildersconでもそんな話をしたことがある気がしますね。
当然、この方式ではメールを受信できる環境が第3者の管理下に置かれた場合などが問題となるわけですが、それは既存のパスワード認証でもだいたい同じことが言えるでしょう。 一時的に利用できない場合もあるかもしれません。その場合は、SMSだったり他の認証方式と組み合わせる必要が出てくるでしょう。 この辺りを頭に入れつつ、見ていきましょう。
新規登録 from PC画面
PCから挙動を見てみましょう。メアドを入れます。
新規登録用のリンクを送りましたと出ます。 いや、出ませんね。ログイン用のリンクって書いてあります。 テンプレート間違えてるのでは疑惑がありますがまぁいいでしょう。
送られたメールにはボタンとリンクで新規登録を続けるためのURLがついています。 HTMLメールの扱いなどもあるかもしれませんが、メールを開く環境とbosyuを利用する環境が別だった場合はコピペしてメアドを入力した環境で処理を続けることができます。
アクセスすると新規登録を続けるための画面になります。
新規登録はこれで完了です。
新規登録 from Modile画面
次にモバイルのブラウザで開いた場合の挙動を確認しましょう。
メアドを入れた後の挙動が変わっています。 新規登録コードを送ったと表示され、入力フォームがあります。
これはメールを確認した後に再びモバイルの画面で処理を続けるために、コード入力という方式を選択しているということでしょう。 当然ながら送られてくるメールの内容もPCからの場合とは異なります。 コードを表示しつつ、リンクをコピペすることでもURLにアクセスできます。
mediumでも同様にPC/Mobileのブラウザ(もしくはアプリかどうかも?)を判別しているようですが、現状ではこのやり方がスタンダードと言えるでしょう。
ログイン
スクショ撮りまくりましたが、だいたい一緒っぽいので省略します。
登録状態の返答
パスワードを利用しないにせよ、メールアドレスを入力する機能となると、登録済みかどうかをどう扱うかが気になるところです。
bosyuの場合は、エラーを表示した後にメアドをフォームから消してくれる仕様となっております。
攻撃者視点で言うと、仮にメアド(とパスワード)のリストがあるときに登録済みかどうかを確認することで、生きているメールアドレスを抽出できるとも言えます。bosyuではパスワードを預かっていないと言うことで直接それが別の攻撃に繋がることはないため、ユーザーフレンドリーに結果をお伝えしていると言うところでしょうか。
この辺りはバランスが難しいですね。個人的には上記Qiitaの記事に書いたとおり画面ではエラーを返さない仕組みにしたいところです。
まとめ
bosyuが実装したメアドで登録/ログインの機能を確認しました。 もっといろいろな機能を持つサービスであれば「メールが急に届かなくなった」場合のリカバリーをもう少し考える必要が出てきて悩ましいところですが、比較的ライトなサービスであればこのぐらいの実装で問題ないと思います。
たくさん使われると良いですね。 ではまた!
(追記 : 前からこの辺の話はQiitaに書いてたので参考までに貼っておきます)