web-dev-qa-db-ja.com

ブラウザーはOAuth2でaccess_tokenを取得しますか?

シングルサインオン用にOpenID Connectを実装することになっているWebアプリケーションの承認コードフローを理解するために10日以上費やしました。相反する情報がたくさんあるように感じますが、まだすべてを明確に把握できていません。

  • 多くの場所で、access_tokenは最終的にはブラウザに到達すると言われています。
  • 私が読んでいる本では、access_tokenがエンドユーザーに配信される必要があると述べていますnever。それは常にサーバーからサーバーへ(client_idおよびclient_secretを使用して)移動する必要があることを明確に述べています。

これは、フローは次のようなものであるべきだと思います

Browser                       Resource Server                  Auth Server
   | --------- GET /authorize ------------------------------------> |
   | <-------- 302 myapp/callback?code=100 ------------------------ |
   | -- GET myapp/callback?code=100 -> |
   |                                   | --- GET /access_token --> |
   |                                   | <-- token --------------- |
   | <- 200 OK ----------------------- |

したがって、この場合、トークンは、機密クライアントでもあるリソースサーバーに到達します。しかし、サーバー自体がトークンにアクセスするためにそれを保持している場合、とにかくトークンのポイントは何ですか?

トークンがブラウザにあり、ユーザーがサーバーに直接リクエストを発行できる場合は、より意味があります。サーバーがセッションCookieとaccess_tokensの間で相互参照を行う必要があるようで、Johnがリソースxを要求していることがわかるようになっているので、私はさらに困惑しました。

私の考えは正しいですか?

ブラウザは認証コードを取得しますが、アクセストークンは取得しません。

OAuth2.0 Authorization Code Grantの場合、Googleドライブに保存したファイルを管理するアプリにログインしているとします。

  • ファイルはresourceです
  • あなたはend-user/resource ownerです
  • アプリはclientサーバーでホストされています
  • Googleはauthorization serverです

アプリで「Googleドライブからファイルを追加」をクリックします。次の情報を使用してGoogleにリダイレクトされます。

  • response_type( 'コード')
  • クライアントID
  • redirect_uri(clientがホスト)
  • スコープ(この場合は 'https://www.googleapis.com/auth/drive';これはURLではなく、資源)
  • 状態(CSRFを防ぐためのランダムな文字列)

これで、Googleログインページが表示され、「アプリがGoogleドライブ上のファイルにアクセスすることを希望しています」というメッセージが表示されます。認証に成功すると、 'redirect_uri'でクライアントにリダイレクトされ、次の情報が示されます。

  • コード
  • 状態(前のステップから)

これでclientがGoogleにリクエストを出します。このリクエストのユーザーエージェントは、end-userのウェブブラウザではなく、clientのサーバーであることに注意してください。 clientは、次の情報を送信します。

  • grant_type( 'authorization_code')
  • コード(前のステップから)
  • redirect_uri(前のものと同一でなければならない)
  • クライアントID
  • 資格情報(許可サーバーは、セキュリティ要件を満たす任意の形式のクライアント認証を受け入れることができます[1])

authorization serverは以下を返します。

  • アクセストークン
  • refresh_token(オプション)

これで、元々あったページに戻りました。バックエンドでは、clientサーバーは、受け取ったばかりのaccess_tokenと独自のIDおよび認証情報を使用して、Googleドライブ上のすべてのファイルにアクセスできます。このアクセストークンがブラウザーに到達することはありません。

OpenID Connect Auhtorizationコードフローは同様の方法を使用しますが、リソースへのアクセスを許可する代わりに、clientend-userを認証できるようにします( 'と思います) Google ')で。

参照:

[1] https://tools.ietf.org/html/rfc6749#section-4.1

1
Ahmad