2012-04-04 3 views
0

私はdojoでログイン機能を作成しようとしています。私の場合、私はこのケースではextern(!!)サーバーへのPOSTリクエストが必要になります。以下のようにdojoでログインしてexternサーバーにリクエストする

ログインが定義されています

login

Login is a special action, not handling any data, but authenticating a user. A POST request is to be made, containing a json object with keys 'email' and 'password'. The return value is either true or false. A special Cookie is returned for further identification.

Valid API Calls

URL: /api/login

Method: POST

Fields:

email

password

Description: Returns all data for the logged in user in PLIST format. if login fails, false is returned in PLIST format.

まあ、私はIOでその問題を解決しようとしました。 iframe.send呼び出しが表示されますが、次のエラーが表示されます。エラー:アクセス許可が拒否されました 'getElementsByTagName'

io.iframeが問題を解決する正しい方法であるかどうかはわかりません。

function login(){ 
    require(["dojo/io/iframe", "dojo/dom"], function(iframe, dom){ 
     var email = dom.byId("logEmail").value; 
     var password = dom.byId("logPassword").value; 

     function JSONreq(){ 

      var jsonpArgs = { 
       method: 'POST', 
       handleAs:"json", 
       content:{ 
        email: email, 
        password: password 

       }, 
       url: "http://---someServerThatIDontWantToName---/api2/login", 
       load: function (response, ioargs){ 
        //console.log(response) 
        alert('succes'); 
       }, 
       error: function(response, ioargs){ 
        alert("error"); 
       } 
      }; 
      iframe.send(jsonpArgs); 
     } 
     dojo.ready(JSONreq); 

    }); 
}; 

モバイル開発のいずれかの違いがある:私の現在のコードは次のようになります。

おそらく、あなたは私の どうもありがとう

PSを助けることができますか?クロスサーバポストリクエストは、モバイルデバイス上で可能でなければなりません。

so:この理由でio.iframe.sendを使用できますか?

+0

あなたはJSONP使用したり、domaindに呼び出し、カール – ZiTAL

答えて

0

要するに、ブラウザクライアント経由でXドメインのPOSTリクエストを使用することはできません。理由は、DOMは別の名前空間で保護されており、io.iframeを通して何が起こっているのかはわかります。

  1. などの作成、存在していない場合(リモート)入力が
    • が存在する場合にはforeachの(ローカル)名前/値のコンテンツ鍵ペアを確認し、GETリクエスト
    • 検索フォームを確立します。dojo.create("input", {type: "hidden", name: name, value: value}, fn);
    • それならばとform.element-of-nameに値を設定します。

ので、最初にすべてのDOMのルックアップのは、順番に、2.1)dojo.createは、同じ理由で失敗します、「は存在する」という意味、セキュリティ上の制限のため)2で失敗します。

典型的な回避策は、あなたのX-domainserver/API /ログイン中

  1. オープンGETメソッド(セットのURLです:プレフィックス+ dojo.formToQuery(フォーム)
  2. は、URLがポーリング間隔で更新されている作成します、作りログインがキープアライブ
  3. がx domainserver/API /ログインにPOSTを行うサーバーサイドあなたのsamehost-サーバー/ API /ログイン/パススルーの 'jumphost' を作成し、その結果を返します。この

    のためのPHPソリューションを与えます

    $ allowedDo mains = array( "http://facebook.whatever。ORG /」、 "http://yournavigation.org/");

    // X-ドメイン上のターゲット要求URIは、言う "フォームアクション" $アクション= $ _REQUEST [ "URL"];

    方法はPOSTを探し、デフォルトは $メソッドは= $ _REQUEST [ "方法"] GET //;

    //クエリのプレースホルダー、_REQUESTを通じて圧延によって満たされたが、メソッド/ URLのペア $以外のすべてを追加しますfields = "";

    //許可されたドメインまたは認可を受けて

    foreachの($ドメインとして$ allowedDomains){

    if (strpos(substr($action, 0, strlen($domain)), $domain) !== false) { 
    header("HTTP/1.0 403 Forbidden"); 
    die("Domain name "".$action."" not allowed. Access denied."); 
    flush(); 
    } 
    

    }

    場合(カウント($ _ REQUEST)> 2){

    foreach ($_REQUEST as $key => $value) { 
    
        if ($key != "url" && $key != "method") // append anything but url and method 
         $fields .= $key . "=" . rawurlencode($value) . "&"; 
    } 
    

    } $フィールド=のSUBSTR( $フィールド、0、strlen($フィールド) - 1);

    //セットアップカール $ ch = curl_init(); if(strtoupper($ method)== "POST"){ curl_setopt($ ch、CURLOPT_URL、$ action); curl_setopt($ ch、CURLOPT_POST、1); curl_setopt($ ch、CURLOPT_POSTFIELDS、$ fields); } else { curl_setopt($ ch、CURLOPT_URL、$ action。 "?"。$ fields);
    } curl_setopt($ ch、CURLOPT_RETURNTRANSFER、1); curl_setopt($ ch、CURLOPT_FOLLOWLOCATION、1); curl_setopt($ ch、CURLOPT_USERAGENT、 "transport.php(CURL)");

    //レスポンスを返信してクローズします。 $ response = curl_exec($ ch); $ info = curl_getinfo($ ch); curl_close($ ch);

    //クライアントの返信応答XHR header( "Content-type:"。$ info ["content_type"]); echo $ response;

1

ターゲットiframeを使用してPOST要求を別のドメインに送信できますが、そのiframeからプロパティまたはDOMノードを読み取ることはできません。

ありXHR2だが、それはすべてのブラウザでサポートされていないと、サーバが特定のヘッダーを返す必要があります。あなたがXHR2経由でPOSTを送信できるかどうかは分かりません。

+0

経由のparamsを送ることができます残念ながら私をたくさん助けていないポスト...私はこれがあることを行っていること、を教えてくれたときに、おそらくそれは、あなたを助けますモバイルアプリ。私はdojoとphonegapを使用しています。私のget要求はうまくいきますが、ログイン文書がどのように表示されるのか、私は最終ログインのための投稿要求が必要です。 – knacker123

関連する問題