典型的な MEAN セットアップを実行しています。フロントエンド レンダリングに Angular、サーバーとして node.js (express) を使用します。静的 HTML/Javascript アセットは、認証を必要とせずにノードから提供されます。フロントエンドに表示されるすべてのデータは、Angular によってノードから要求されます。Angular は、ajax リクエストの「Authorization」ヘッダーでベアラー JWT トークンを提供することにより、ノード エンドポイントに対してユーザーを承認します。
これは完全に機能しますが、このセットアップでの Google API OAuth2 統合に関しては、私は行き詰まっています。目標は、ユーザーのカレンダー データを webapp に表示することです。
- Angularは、リクエスト ヘッダーでベアラー トークンを提供するノードから/api/calendarsをリクエストします。
- サーバーがそのユーザーの Google アクセス トークンをまだ持っていない場合、Google トークン要求 URL ( callbackUrl /api/calendars/googleCallback を含む) を作成し、これを Angular に送り返します。
- Angular が応答としてカレンダー データの代わりに tokenRequest-Url を受け取ると、ユーザーをこの URL にリダイレクトし、Web アプリケーションのアクセス許可を手動で付与します。
- Google は、アクセス コードを提供する callback-Url にリダイレクトします。
問題はステップ 4 です。ノード サーバーはステートレスであり、Google から/api/calendars/googleCallback?code=XYZへのリダイレクトには Authorization ヘッダーが含まれていないため、サーバーは識別できず、提供されたアクセス コードが属するユーザーを認証できません。
Google は事前に指定された固定のコールバック URL のみを受け入れるため、コールバック URL にユーザーを識別するある種のハッシュを動的に追加しても機能しません (とにかく安全ではないようです)。ユーザー ID を Cookie に保存することもできますが、これは全体的な JWT アプローチに違反しているように感じます。
上記のフローが一般的に悪い考えなのか、またはバックエンドがコールバックへのリクエストが属するユーザーを識別できるようにするために、この状況に対処するためのベスト プラクティスがあるのかという疑問があります。
ありがとう!