作成中の API に OAuth2 を使用しようとしていますが、フローがどのように機能するかについていくつかの説明を使用できます。同様の質問を見つけました (例:サードパーティの OAuth プロバイダー (DotNetOpenAuth を使用) を使用して認証を許可しながら、OAuth で REST API を保護する) が、サードパーティのログインに関しては明確にされていません。
特に委任による認証が問題なく機能する場合は、OpenID を使用したくありません (とにかく)。非常に複雑に見え、サポートされているライブラリが多くありません。(私はPHP + Laravel 4を使用しています)
問題は 4 つのエンティティに分けられます。
- リソース所有者 - エンド ユーザー
- クライアント - ブラウザー (マイ Web サイト)、モバイル アプリなど
- 認可サーバー - 私の OAuth2 サーバー
- リソース サーバー - 私の API。ユーザーデータを提供します。
ユーザーが認証サーバーでアカウントを作成し、そのアカウントを使用してログインするときの流れを理解したと思います。
- ユーザーはクライアントでユーザー名/パスワードを入力します。
- クライアントは、リソース所有者フローを使用して認証サーバーに接続し、ユーザーを認証し、クライアントを自動的に承認します。
- ユーザーは、ユーザー ID を含むトークン + 署名付き JWT を使用して、AUth サーバーからクライアントにリダイレクトされます。
- クライアントはトークンをセッションに保存します。
- クライアントは、トークン + 署名付き JWT ユーザー ID を使用して、リソース サーバーからデータを要求します。
- Resource Server は JWT を検証し、トークン スコープに応じてデータを返します。
ワークフローはまだテストしていませんが、うまくいくようです。ただし、サードパーティのログインはより困難であることが証明されています. これは私がこれまでに得たものです:
- ユーザーが Google/Facebook/LinkedIn でログインをクリックします。
- ユーザーはクライアントから Google の認証サーバー (私のものではない) にリダイレクトされます。
- ユーザーは user/pass を使用してログインし、クライアントが保護されたリソース (userinfo.email) をフェッチすることを承認します。これにより、委任によってユーザーが認証されます。
- ユーザーは、Google ユーザー ID を含むトークン + 署名付き JWT を使用してクライアントにリダイレクトされます。
- クライアントは JWT を検証します。
- クライアントは、クライアント資格情報フローを使用してリソース サーバーに接続します。新しいトークンを受け取ります。
- クライアントはトークンをセッションに保存します。
- クライアントは、Google ユーザー ID をアプリケーション ユーザー ID に変換するように要求します。(この接続はサインアップ時に行われました。)
- Resource Server は、アプリケーションのユーザー ID を返します。(署名付き JWT)
- クライアントは、トークン + 署名付き JWT ユーザー ID を使用して、リソース サーバーからデータを要求します。
- Resource Server は JWT を検証し、トークン スコープに応じてデータを返します。
これは機能するかもしれませんが、非常に複雑に感じます。確かに、これらのステップのいくつかをスキップする方法があるに違いありません? 特にステップ 8 ~ 10 に関心があります。私の知る限り、ユーザーはサードパーティのログインを使用して認証サーバーとやり取りする必要はまったくありません。問題は、成功した id_token (または何か) を Google/Facebook/LinkedIn から API の「アカウント」リソースに接続する方法です。
現時点では、他のクライアントが API に接続することは心配していませんが、将来的にはそうなるでしょう。