18

正しい方法で物事を行っていない限り、私は特定の問題を抱えています。

クライアント (html サイト) と API (express + mongodb で構築) の 2 つの側面を持つアプリケーションがあります。API には安全にアクセスする必要があります。どちらも異なるドメインにあります。今のところ、私のサイトが domain.com にあり、API が api.com:3000 にあるとしましょう。

データを使用してユーザーを作成するときに、Github からアクセス トークンを取得するためにパスポートを追加したので、基本的に「Github でサインイン」できます。

私の現在のプロセスは次のとおりです。

1) クライアント (サイト) が API でポップアップを開く

window.open("http://api.com:3000/oauth")

2) エクスプレス サーバーは、パスポート プロセスを開始します。

app.get('/oauth', passport.authenticate('github'), function(req, res) {

});

戦略には、このコードを使用しました。

3) ポップアップを閉じる URL にコールバックをリダイレクトします (window.close() を使用した JavaScript):

app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) {
    res.redirect('/auth_close');
});

その時点で、すべて問題なく、API にログインしています。私の問題は、クライアントがaccessToken、ユーザー、またはユーザーIDについてまだ何も知らないため、データをクライアントに戻す方法です。

そこで、クライアント (ポップアップを開くサイト) から、さまざまなアプローチを試みました。

  • ポップアップから値を取得する: リダイレクトが原因で機能しません。ポップアップの JavaScript 情報を見失います

  • http://api.com:3000/currentなどのセッションで「現在のユーザー」を取得するために API を呼び出す もう 1 つの要求、理想的ではありませんが、これは機能します。しかし、まだ問題があります。

この /current url は、ブラウザーから到達した場合にユーザーを返します。これは、ブラウザーがヘッダー要求でエクスプレス セッション Cookie を送信するためです。

Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE

問題は、jquery などからこの要求を行う必要があることです。セッションが送信されないために失敗します。したがって、ユーザーは返されません。

app.get('/current', function() {
    // PROBLEM HERE, req.user is undefined with ajax calls because of the session!
});

私はそれを機能させる方法を見つけましたが、クロスブラウザーのCORSの問題があるため、満足していません。表現するために追加しています:

res.header("Access-Control-Allow-Credentials", "true");

ここで説明されているように、jquery ajax 呼び出しに withCredentials フィールドを追加します。

ネイティブ XHR オブジェクトに設定する fieldName-fieldValue ペアのマップ。たとえば、必要に応じてクロスドメイン リクエストに対して withCredentials を true に設定するために使用できます。

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

ヘッダーのワイルドカードを失っているため、これにも満足していません: 、ここでAccess-Control-Allow-Origin説明されているように、ドメインを指定する必要があります。

したがって、ここで取るべきアプローチがわかりません。必要なのは、クライアントが accessToken またはパスポート oauth プロセスから返されるユーザー ID のいずれかを取得することだけです。アイデアは、API への各呼び出しでそのトークンを使用して、呼び出しを検証することです。

どんな手掛かり?

4

2 に答える 2

13

同じ問題がありました。ログインページで Local Strategy を使用していて、ユーザーが他のリクエストでセッションに参加しているかどうかを確認していました。

あなたが言うように、解決策は CORS を使用して、セッション ID を XMLHTTPRequest を使用して Cookie に渡すことです。

まだすべてのブラウザで機能しない CORS を使用する代わりに、他のリクエストでアクセス トークンを使用することにしました。私が使用したワークフローは次のとおりです。

POST /login
  • ユーザー名とパスワードは本文で渡されます。
  • Local Strategy を使用した認証。
  • 応答は、access_token を含むユーザー オブジェクトを返します

GET /endpoint/abc123?access_token=abcdefg

  • ログイン応答から取得したトークン
  • Bearer Strategy を使用した認証 (passport-http-bearer 内)

Express ではセッションは不要になりました。

この代替手段が役立つことを願っています。

于 2013-01-23T16:00:15.300 に答える