カラクリスタ

「輝かしい青春」なんて失かった人のブログ

OAuthやOpenIDを使わないPassword-Less Authenticationは可能か?

概要: というようなコトを今日の午前中、ずっと考えてた


結論から言うと、既に存在した。それが以下:

https://nopassword.alexsmolen.com/NoPassword


で、上記リンク先の認証方法は凄い簡単で、

  1. ログインする際にユーザーにメールアドレス入力させる
  2. 入力されたメールアドレスにワンタイムトークンくっつけて送る
  3. ユーザーはワンタイムトークン付きリンクを踏む
  4. すると認証されてログイン完了

という感じ。

で、僕はこれ見て思ったのが、

ログインするたびにメール送られてくるのウザくね?

とか素直に思いました。


で、上記の認証方法も結構変態と言えば変態なんだけど、僕なりに考えた結果、

  • メール送る代わりに Websocket with SSL/TLS で、公開鍵認証すればいいんじゃね?

とか思いついたので、それも書いておくと、

  • 前提 1. ユーザーは、公開鍵と秘密鍵のペアをブラウザ上で保持しておく 例えば localStorage とか

  • サーバーは、ユーザーの公開鍵をユーザー登録時に保持しておく

  • 認証 1. ユーザーは、ログイン画面でユーザー名を入力

  • サーバーは、 1. ログイン用のワンタイムトークンを

  • 入力されたユーザー名に紐づく公開鍵で暗号化し
  • WebSocket with SSL/TLS で送信する

  • 暗号化されたワンタイムトークンを受け取ったユーザー側は 1. 秘密鍵でワンタイムトークンの暗号化を解除

  • 今度はその生のワンタイムトークンを Websocket with SSL/TLS で送信する

  • 生ワンタイムトークンを受け取ったサーバー側は、 1. ワンタイムトークンを検証

  • 検証して整合した場合、ログインを許可する

という感じ。うん、どう考えても変態ですね。


で、これを書いていて気がついたんだけど、これ、ブラウザ上で変態な実装しなくても

Authy

とか使えば良いんではないだろうか、とか思ったりした。

どういう事か、っていうと、簡単に言えば、

  • ログインの際のワンタイムトークンの云々を Authy に丸投げする

という感じ。

まあ Authy は本来、二段階認証の為のツールなんだけど、それをあえて Authy のみの認証にしてしまうという。ただまあ、その方法は、ちょっとアレゲな気もしないでもないけど。


まあとりあえず今日考えて以上です。はい。

FIXME