2015-11-17 15 views
5

私はNode.jsサーバー上でPassportを設定しており、主にTwitter認証戦略を使用しています。Passport.js - ブラウザのGETリクエストはOKですが、JSコードからのAJAXリクエストはありませんか?

ブラウザURL(Webブラウザの検索バーを使用)でのGET要求が、アプリケーションコード内からのAJAX要求とは異なる認証を受けているように思われる最近の発見には混乱しています。たとえば、私がPassportでログインした場合、私はブラウザにバックエンドサーバーに直接リクエストを送る特定のURLを指定することですべてにアクセスできます。しかし、バックエンドAPIに対するAngularまたはjQueryのリクエストは許可されていないようです。

これはまったく正しいでしょうか?もしそうならば、パスポートはJSコード内からのブラウザリクエストとAJAXリクエストの違いをどのように知っていますか?

+1

(1)リクエストがXHR(AJAX)リクエストであるかどうかを確認できます。 (2)おそらく、正しいクッキーを持っていないという問題です。 Node.jsサーバーとまったく同じホスト名にあるAngularまたはjQueryコードですか? – apscience

+0

を参照してください。http://stackoverflow.com/questions/15945118/detecting-ajax-requests-on-nodejs-with-express – apscience

+0

コードが正しくないか、コードが単純に間違っている可能性があります。もちろん、 –

答えて

4

デフォルトでは、クロスオリジンXHR要求にはCookie(認証を必要とするアプリケーションで状態を維持するために通常使用される)は含まれません。

あなたはwithCredentialsを設定することでことを変更することができます。

var xhr = new XMLHttpRequest(); 
xhr.open(...); 
xhr.withCredentials = true; 

あなたはAccess-Control-Allow-Credentials: trueを言うために、サーバー上のCORSルールを調整する必要があります。

MDNも参照してください。

+0

これはトリックを行うようだ。私は$ httpProvider.defaultsを使ってAngularでこれを行うことができました。 –

+0

クエンティンに感謝します。私は150ポイントを与えました。しかし、新しい問題が1つあります。あなたのソリューションはHTTPで動作しますが、HTTPSで動作するかどうかはわかりません。 XHRで資格情報を使用することがHTTPSで禁止されているのか、追加の手順が必要なのかを知っていますか? –

+1

私が知っている限りではなく、HTTP経由でロードされたページからHTTPSへのリクエストを行うか、その逆の場合でも、ブロックされる可能性があります。そうしないとセキュリティで保護されたデータに対してman-in-the-middle攻撃を開始できません。 – Quentin

1

Twitterの認証戦略では、ユーザーがTwitterにログインし、Twitterアカウント情報にアクセスするための「アプリ」権限が必要です。ユーザーがまだサインインしていない場合、TwitterにログインするためにTwitterクレデンシャルを入力する方法は、XHRではできません。リクエストがXHR経由で送信された場合、Twitterの「アプリ」がリクエストしている権限をユーザがどのように承認しますか?

これは、OAuthまたはOpenIDを利用するすべてのPassport戦略に適用されます。ユーザーのブラウザは、A)認証プロバイダにログインするか、またはB)アプリケーションで要求しているアクセス許可を承認できるように、認証プロバイダのサイトに直接移動する必要があります。ユーザーが完了すると、認証プロバイダー(あなたの場合はTwitter)は、ユーザーのブラウザーをアプリケーションのエンドポイントにリダイレクトしてから、アプリケーションが認証プロバイダーからの情報を要求するために使用するトークン(電子メールアドレス、氏名など)

関連する問題