2011-12-16 27 views
1

現在jqueryを使用しているユーザースクリプトで作業しています。これは、フォーラムにログインするためにhttp Webページでhttps要求を呼び出します。 しかし、私はクッキーの問題に会いました。クッキーは、ajaxリクエストでは設定できませんでした。ajax経由でhttpsサーバーにログインできません

ここでは2枚の画像は、伝統的なログインとAJAXのログインの違いを示しています

伝統1:

  1. ポストのユーザ名とパスワードとを取得するSet-Cookie
  2. はへのアクセスを得るために、サーバーにクッキーを送りますいくつかのWebページ traditional login

アヤックス1:

  1. 使用$.post()ユーザー名とパスワードを掲示、およびセットクッキーを取得するための
  2. サーバー

ajax login

そして、ここにクッキーを送信していない私は私のGreasemonkeyのuserscriptを投稿:

// ==UserScript== 
// @name   test 
// @namespace  test 
// @description test 
// @include  http://solidot.org/* 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js 
// ==/UserScript== 
//after events dealing and blahblahblah 
$.post('https://bbs6.sjtu.edu.cn/bbslogin',{id:'some',pw:'password'}); 
$.post('https://bbs6.sjtu.edu.cn/bbssnd',{board:'SJTUNews',title:'some',text:'article'}); 

誰かが私を助けることができますか?

+0

私たちのためのコードはありますか? – Hristo

+0

クッキーの設定に使用しているコードを含めることができますか? – ManseUK

+0

@Hristo OK、私はスクリプトの主要部分を投稿します。残りの部分はイベントバインディングに関するもので、関連性があるとは思われません。 – Rufus

答えて

2

:と投稿するウェブサイトはhttps:です。ブラウザとjqueryに組み込まれているクロスサイトスクリプティングの制限を処理しています。同じサーバー上のWebサービスにjqueryを使用しているときにも同様の問題に遭遇しましたが、別のポート(これも同様に実行しようとしています)です。

いくつかのオプション: - 通常のフォームボタン でポストを行うには - httpsにjqueryのを移動するドメイン(HTTPSがログインする前にアクセスする必要があろう。これは、安全なパスワードの送信を与え、まだあなたがへのアクセスをブロックする必要がありますコンテンツをhttpsアクセスとは別に) - ギャップを埋めるためにサーバー側のスクリプトを使用します。私はhttp://benalman.com/projects/php-simple-proxy/が非常に有用であることを発見しました。

私の仮説が正しいかどうかを確認するために問題を診断するには、Firefoxに組み込まれたWebコンソール(FireBugが好きです)、またはChrome用のオプションの開発者パッケージを使用できます。

コンソールを見てください。 postコマンドを確認してください。あなたの投稿が予定されているドメイン/ポートに注意してください。ドメイン/ポート情報が投稿から削除されることが予想されます。

もう1つのオプション:Cross domain with jQuery。ただし、クロスドメインを許可する場合は、他のドメインのバックドアを開かないように注意してください。

これが役に立ちます。

+1

ありがとう、合理的な答えが最終的に現れた、私はほとんど希望をあきらめた。 – Rufus

+0

ご了承いただきありがとうございます。私は光を見た前に自分自身を闘争してきました(同じマシン上の異なるポートはクロスドメインでもあります) – Adriaan

0

私はこれがなぜか分かりませんが、私は修正する方法を知っていると思います。

phpでクッキーを設定する必要はありませんが、JavaScriptで設定することもできます。

var login = $.post('https://bbs6.sjtu.edu.cn/bbslogin', {id: 'some', pw: 'password'}) 
    .success(function() { 
     if (login.getResponseHeader("Set-Cookie") != null) 
      /** 
      * Normally this returns a string but if not just do it with each value of the array 
      */ 
      document.cookie = login.getResponseHeader("Set-Cookie"); 
     else 
      alert("Login failed"); 
    }) 
    .error(function() { 
      alert("Login failed"); 
    }); 

これが機能しない場合、それはまた、あなたが断食するための第2のAJAX要求を発射するということなので、これまでこれを変更しようとすることができます:あなたのログインがHTTP上にあるので

$.post('https://bbs6.sjtu.edu.cn/bbslogin', {id: 'some', pw: 'password'}) 
     .success(function() { 
       $.post('https://bbs6.sjtu.edu.cn/bbssnd', board:'SJTUNews',title:'some',text:'article'}); 
     }); 
+0

まだそれを行うことはできません、私はそれがブラウザのポリシーと関係があると思います。私はmozillaに助けを求めるでしょう。 – Rufus

1

@adriaanがこれに直接回答し、私は彼にそれについてのポイントを与えました。

これはAJAXでは実行できません。

あなたがシミュレートするために、次のよう試みることができます。

  • ないのpostMessageブラウザのサポートは、その後、HTTPS経由でログインページに直接投稿したり、使用している場合のiframeハッシュ変更のポーリング技術を。
  • postMessageブラウザでサポートされている場合は、iframeに渡ってJavaScript経由でネイティブにクロスドメイン通信をサポートし、iframeにフォームアクションを送信できます。
  • 人々は、現在のURLの容疑者であるため、これは議論の余地がポイントかもしれ私はそれがWebサイトのセキュリティの知覚に顧客の信頼レベルからHTTPSにリダイレクトすることが好ましいことだと思う

最初の場所にHTTPSではありません同様に、強制的なHTTPSがexommerceで発生する方法。

例として、KitGUI.comを参照してください。

関連する問題