0

典型的な MEAN セットアップを実行しています。フロントエンド レンダリングに Angular、サーバーとして node.js (express) を使用します。静的 HTML/Javascript アセットは、認証を必要とせずにノードから提供されます。フロントエンドに表示されるすべてのデータは、Angular によってノードから要求されます。Angular は、ajax リクエストの「Authorization」ヘッダーでベアラー JWT トークンを提供することにより、ノード エンドポイントに対してユーザーを承認します。

これは完全に機能しますが、このセットアップでの Google API OAuth2 統合に関しては、私は行き詰まっています。目標は、ユーザーのカレンダー データを webapp に表示することです。

  1. Angularは、リクエスト ヘッダーでベアラー トークンを提供するノードから/api/calendarsをリクエストします。
  2. サーバーがそのユーザーの Google アクセス トークンをまだ持っていない場合、Google トークン要求 URL ( callbackUrl /api/calendars/googleCallback を含む) を作成し、これを Angular に送り返します。
  3. Angular が応答としてカレンダー データの代わりに tokenRequest-Url を受け取ると、ユーザーをこの URL にリダイレクトし、Web アプリケーションのアクセス許可を手動で付与します。
  4. Google は、アクセス コードを提供する callback-Url にリダイレクトします。

問題はステップ 4 です。ノード サーバーはステートレスであり、Google から/api/calendars/googleCallback?code=XYZへのリダイレクトには Authorization ヘッダーが含まれていないため、サーバーは識別できず、提供されたアクセス コードが属するユーザーを認証できません。

Google は事前に指定された固定のコールバック URL のみを受け入れるため、コールバック URL にユーザーを識別するある種のハッシュを動的に追加しても機能しません (とにかく安全ではないようです)。ユーザー ID を Cookie に保存することもできますが、これは全体的な JWT アプローチに違反しているように感じます。

上記のフローが一般的に悪い考えなのか、またはバックエンドがコールバックへのリクエストが属するユーザーを識別できるようにするために、この状況に対処するためのベスト プラクティスがあるのか​​という疑問があります。

ありがとう!

4

1 に答える 1

0

わかりました-簡単な解決策を見落としました:

Google がルーティングして callbackurl に追加するトークン クエリで状態パラメータを使用します: https://developers.google.com/accounts/docs/OAuth2Login#state-param

ノード内:

var googleApi = require('googleapis');
var oauth2Client = new googleApi.auth.OAuth2(config.clientId, config.clientSecret, config.callbackUrl);

var options = {
    access_type: 'offline',
    state: 'hashed-useridentified',
    scope: [
        'https://www.googleapis.com/auth/calendar.readonly'
    ].join(' ')
};
oauth2Client.redirectUri_ = 'http://someserver.com/api/auth/google/calendar/callback';
var generatedUrl = oauth2Client.generateAuthUrl(options);
于 2014-11-14T19:58:30.440 に答える