OAuthやOpenIDを使わないPassword-Less Authenticationは可能か?
読了まで:約1分
概要: というようなコトを今日の午前中、ずっと考えてた
結論から言うと、既に存在した。それが以下:
で、上記リンク先の認証方法は凄い簡単で、
- ログインする際にユーザーにメールアドレス入力させる
- 入力されたメールアドレスにワンタイムトークンくっつけて送る
- ユーザーはワンタイムトークン付きリンクを踏む
- すると認証されてログイン完了
という感じ。
で、僕はこれ見て思ったのが、
ログインするたびにメール送られてくるのウザくね?
とか素直に思いました。
で、上記の認証方法も結構変態と言えば変態なんだけど、僕なりに考えた結果、
- メール送る代わりに Websocket with SSL/TLS で、公開鍵認証すればいいんじゃね?
とか思いついたので、それも書いておくと、
- 前提 1. ユーザーは、公開鍵と秘密鍵のペアをブラウザ上で保持しておく 例えば
localStorage
とか
- サーバーは、ユーザーの公開鍵をユーザー登録時に保持しておく
- 認証 1. ユーザーは、ログイン画面でユーザー名を入力
-
サーバーは、 1. ログイン用のワンタイムトークンを
-
入力されたユーザー名に紐づく公開鍵で暗号化し
-
WebSocket with SSL/TLS で送信する
-
暗号化されたワンタイムトークンを受け取ったユーザー側は 1. 秘密鍵でワンタイムトークンの暗号化を解除
-
今度はその生のワンタイムトークンを Websocket with SSL/TLS で送信する
-
生ワンタイムトークンを受け取ったサーバー側は、 1. ワンタイムトークンを検証
-
検証して整合した場合、ログインを許可する
という感じ。うん、どう考えても変態ですね。
で、これを書いていて気がついたんだけど、これ、ブラウザ上で変態な実装しなくても
とか使えば良いんではないだろうか、とか思ったりした。
どういう事か、っていうと、簡単に言えば、
- ログインの際のワンタイムトークンの云々を Authy に丸投げする
という感じ。
まあ Authy は本来、二段階認証の為のツールなんだけど、それをあえて Authy のみの認証にしてしまうという。ただまあ、その方法は、ちょっとアレゲな気もしないでもないけど。
まあとりあえず今日考えて以上です。はい。
#FIXME