質問: 最近のWebシステム(あるいは広義の「Webサービス」)はOAuth2が使われることが多くなってきましたが、 OAuth2が行うのはあくまでも「認可」であって、「認証」として使うのは危険であると書かれているのを(流し)読みました。 単なる OAuth 2.0 を認証に使うと、車が通れるほどのどでかいセキュリティー・ホールができる | @_Nat Zone ... ここで質問なのですが、 OAuth2を使ったシステムでは、 認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。 また、OAuth2を使わずにログイン(そのサービス固有のアカウントでパスワードログイン)する場合と、 OAuth2でログインする場合では、 「認証」の部分は同じなのでしょうか。 全部でなくても良いので、もしくは 参考URL貼っていただくだけとかでもかまいませんので、回答お待ちしております。 よろしくお願いします。
回答: なるべく誤解がないようにしたかったのですが、長文になりました...。 ご参考になれば、幸いです。 > > OAuth2を使ったシステムでは、 > > 認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。 > > > OAuth2やOpenID Connectの様な仕組みは、 **「IDとパスワードを他に漏らさずに、サービスを提供したい」**というような着想から出ています。 例えば、何かのゲームのプレイ内容をツイートしたいというような場合、 twitterのIDパスワードをそのゲームに管理させずにツイートさせる、 というイメージです。 先の例で、OAuth2を使用したとしますと、 「twitterは「○○ゲーム」より「ツイートの投稿」機能を要求されています。認可しますか?」 というような文面とともに、twitterのIDパスワードの入力フォームが出ると思います。 そして、この画面はtwitterの管理下にあるはずです。 何かのゲームの管理下の画面では無いはずです(IDとパスワードが他に漏れています)。 ですので、ご質問の > > OAuth2を使ったシステムでは、 > > 認証の部分は昔ながらのユーザーテーブル管理(パスワードはハッシュするとか)のようにしているのでしょうか。 > > > は具体的には、 「OAuth2の認可の過程で行われる認証の為のIDパスワードは、サービスの使用側ではどのように管理しますか?」 という内容でしたら、 「管理しません」という事になるでしょうか。 > > また、OAuth2を使わずにログイン(そのサービス固有のアカウントでパスワードログイン)する場合と、 > > OAuth2でログインする場合では、 > > 「認証」の部分は同じなのでしょうか。 > > > OAuth2は「認可」の為の仕組みで「認証」の為の仕組みではありません。 **「認証」の場合は、OAuth2を拡張したOpenID Connectが良いと思います。** OAuth2は、先ほどの例えでは、 何かのゲームに、 twitterの機能(ツイートの投稿)を利用する事を 「認可」する為の仕組みです。 これが認証として使われてしまっているのは、 認可する際に認証が行われており、 その認証が行われたという結果だけ流用し、 別サービス(例えば何かのゲーム)の認証としてみた、 という発想からでしょうか。 しかしながら、そこで行われた認証は、 本来、例えば、**twitterのツイート投稿機能を利用する事を認可する為「だけに」行われた認証であって、** **何かのゲームの為の認証ではありません。** つまり、twitterの機能を利用できる事をもって、 何かのゲームにログインできるというのは、 おかしな話だ、という事です。 ですので、ご質問の返信としましては まず、**OAuth2でログイン処理を書くべきではないでしょう。** OAuth2ではなく、OpenID Connectで書かれる場合でしたら、 > > 「認証」の部分は同じなのでしょうか。 > > > そこそこ違うものになるはずです。 データ構造ですが、 パスワードは、こちらでは用いないでしょう。 IDは、OpenID Connectの認証で得られる情報(subject等)と紐付けておく必要があるかと思います。 画面も、 「[twitterでログイン]ボタンを押す」 →「twitter側に飛ばされて、IDパスワードのフォームでログイン」 →「戻ってくる」 という風になりますので、ログインフォームを用意する必要はありません。 しかし、戻ってきた際に認証結果を取得するための処理が追加で必要です。 以降のセッションの発行や管理は同じかと思います。