web-dev-qa-db-ja.com

OAuth 2:リソースサーバーと承認サーバーの分離

OAuth 2仕様では、「リソースサーバー」と「承認サーバー」は必ずしも同じアプリケーションである必要はないが、実際にどのように実装されるかを理解するのに苦労しています実際には。

例として、次のアプリが存在するとします。

  • リソースサーバー
  • 認可サーバー
  • webフロントエンド
  • サードパーティのクライアントアプリ

シナリオ1:Webフロントエンドへのログイン

  • ユーザーがログインフォームを送信する
  • webアプリは認証サーバー(grant_type = password)に資格情報をPOSTし、access_tokenを受信します
  • webアプリはセッションにaccess_tokenを保存します
  • 後続の各リクエスト時:
    • リソースサーバーからリソースを取得し(Authorizationヘッダーのaccess_tokenを使用)、Webフロントエンドでレンダリングします。
    • 401を取得したら、ユーザーをログアウトします(セッションからaccess_tokenを削除します)

シナリオ#2:サードパーティアプリの承認

  • ユーザーが認証サービスに承認を要求する
  • 許可/拒否フォームが表示されます
  • ユーザーは認証コードが存在する状態でクライアントアプリにリダイレクトされます
  • クライアントアプリがコードを認証サービス(grant_type = authorization_code)にPOSTし、access_tokenを受信する
  • クライアントは、リソースサーバーからリソースを取得します(Authヘッダー付き)

理解できないのは、シナリオ#2で許可/拒否フォームを表示する前にユーザーを認証する方法です。ユーザーはメインWebアプリにログインしている可能性がありますが、認証サービスはそのことを認識していないため、どういうわけかユーザーを再度認証する必要があります。認証サービスは、ログイン/セッションもサポートする必要がありますか?

次の2つの理由から、Webアプリが許可/拒否フォームの表示を担当するほうが理にかなっているのではないかと思います。

  1. すべてのUIを1つのアプリに保持します
  2. ユーザーが既にWebアプリにログインしている場合、ユーザーに資格情報の再送信を強制しない

シナリオ#2の代替案の1つを次に示します。

  • ユーザーがWebアプリから承認をリクエストする
  • 許可/拒否フォームが表示されます
  • webサーバーが認証サーバーにPOSTして新しい許可を作成し、認証コードが返されます
  • webアプリが認証コードが存在するクライアントアプリにリダイレクトする
  • クライアントアプリがコードを認証サービスにPOSTし、access_tokenを受信する

これを処理する最良の方法は何ですか?一般的なコメント、アドバイスなどは素晴らしいです!

ありがとう

39
scttnlsn

あなたの代わりのシナリオはおそらくあなたが行きたいものです:あなたが本当にあなたの流れを分離したいのであれば、あなたはこのようなことを試すことができます:

  1. ユーザーは、grant_type = codeを使用して、サービスに代わって認証サービスに承認をリクエストします
  2. 認証サービスは、ユーザーがログインしていないことを認識します。Webサーバーにユーザーの返信を要求するリクエストパラメータを使用して、Webアプリケーションにリダイレクトします。
  3. webアプリは要求パラメーターを保存し、ユーザー名/パスワードを要求します
  4. webアプリは認証情報(grant_type = password)に認証情報をPOSTし、access_tokenを受け取ります。
  5. webアプリはセッションにaccess_tokenを保存します
  6. webアプリは、ユーザーIDをキャプチャする署名済みトークンを生成し、リクエストパラメータとして署名済みトークンを使用して認証サービスにリダイレクトします。
  7. 認証サービスは署名されたトークンを解析し、ユーザーIDを抽出し、許可/拒否フォームを表示します
  8. ユーザーは認証コードが存在する状態でクライアントアプリにリダイレクトされます
  9. クライアントアプリがコードを認証サービス(grant_type = authorization_code)にPOSTし、access_tokenを受信する
  10. クライアントは、リソースサーバーからリソースを取得します(Authヘッダー付き)
5
Femi

OAauth2フレームワークのドキュメント: https://tools.ietf.org/html/rfc6749

(A)クライアントは、許可サーバーで認証し、許可付与を提示することにより、アクセストークンを要求します。

(B)承認サーバーがクライアントを認証し、承認付与を検証し、有効な場合は、アクセストークンと更新トークンを発行します。

(C)クライアントは、アクセストークンを提示することにより、リソースサーバーに対して保護されたリソース要求を行います。

(D)リソースサーバーはアクセストークンを検証し、有効な場合はリクエストを処理します。

(E)手順(C)および(D)は、アクセストークンの有効期限が切れるまで繰り返されます。クライアントは、アクセストークンが期限切れであることを知っている場合、ステップ(G)にスキップします。それ以外の場合は、別の保護されたリソース要求を行います。

(F)アクセストークンが無効であるため、リソースサーバーは無効なトークンエラーを返します。

(G)クライアントは、承認サーバーで認証し、更新トークンを提示することにより、新しいアクセストークンを要求します。クライアント認証の要件は、クライアントのタイプと許可サーバーのポリシーに基づいています。

(H)承認サーバーはクライアントを認証し、更新トークンを検証し、有効な場合は、新しいアクセストークン(およびオプションで新しい更新トークン)を発行します。

6
Rzv Razvan