ここ数時間、Oauth2 プロトコルについて読んでいました。私の理解では、このプロトコルの主な動機は、リソース所有者が資格情報をサード パーティ (クライアント) アプリケーションと共有する必要がなく、リソース サーバーのみと共有する必要があることです。
この投稿では、Oauth2 RFCで定義されているロールを使用しました。ただし、リソースサーバーと認可サーバーの区別はしていません。簡単にするために、それらは同じであると仮定し、それらを「リソースサーバー」と呼びます。
2 つの異なる一連のイベントが表示されます。どちらのシナリオも、クライアントが保護されたリソースにアクセスできるようにする意図を持つリソース所有者から始まると仮定します。
ケース 1、リソース サーバーが提供する GUI
- クライアントは、リソース所有者をリソース サーバーのログイン ページに転送します。
- リソース所有者は、リソース サーバーの GUI で資格情報を提供します。
- 成功すると、リソース サーバーはリソース所有者をクライアントに転送し、ユーザー クライアントにトークンを提供します。
ケース 2、クライアントが提供する GUI
- クライアントは、リソース所有者に自分の資格情報を独自の GUI に提供するように依頼します。
- クライアントは、提供された資格情報をリソース サーバーに送信します。
- 成功すると、クライアントはトークンを取得し、リソース サーバーにアクセスします。
私の懸念はケース 2 です。クライアントとして認証するのではなく、リソース所有者として認証する場合、クライアントがリソース サーバー上で完全な特権を取得するのはどれほど難しいでしょうか? RFC は、クライアントがリソース所有者の資格情報を処理できるようにする代わりに、OAuth2 を使用する理由として次のように述べています。
「サードパーティのアプリケーションは、リソース所有者の保護されたリソースに過度に広範囲にアクセスできるようになり、リソース所有者は期間を制限したり、限られたリソースのサブセットにアクセスしたりすることができなくなります。」
RFC はさらに次のように述べています。
「サードパーティのアプリケーションは、将来の使用のためにリソース所有者の資格情報を保存する必要があります。通常、パスワードはクリアテキストです。」
これは、ケース 2 のクライアントによって非常にうまく保存される可能性があります。
では... Oauth2 を実装するクライアント (ケース 2) は、実装しないクライアントよりも安全であると想定できますか? リソースサーバーがこれらのようなことを防ぐメカニズムを実装することは可能ですか?