シングルサインオン用に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
サーバーでホストされていますauthorization server
ですアプリで「Googleドライブからファイルを追加」をクリックします。次の情報を使用してGoogleにリダイレクトされます。
client
がホスト)これで、Googleログインページが表示され、「アプリがGoogleドライブ上のファイルにアクセスすることを希望しています」というメッセージが表示されます。認証に成功すると、 'redirect_uri'でクライアントにリダイレクトされ、次の情報が示されます。
これでclient
がGoogleにリクエストを出します。このリクエストのユーザーエージェントは、end-user
のウェブブラウザではなく、client
のサーバーであることに注意してください。 client
は、次の情報を送信します。
authorization server
は以下を返します。
これで、元々あったページに戻りました。バックエンドでは、client
サーバーは、受け取ったばかりのaccess_tokenと独自のIDおよび認証情報を使用して、Googleドライブ上のすべてのファイルにアクセスできます。このアクセストークンがブラウザーに到達することはありません。
OpenID Connect Auhtorizationコードフローは同様の方法を使用しますが、リソースへのアクセスを許可する代わりに、client
がend-user
を認証できるようにします( 'と思います) Google ')で。
参照: