1

全て、

申し訳ありませんが、これはおそらく非常に奇妙な質問です。

私はフラッシュRIAに取り組んでいます。これが行うことの 1 つは、(別のドメインに存在する) ASP ページを呼び出してデータを取得することです。

ただし、その ASP ページでは、ユーザーがその ASP ページを呼び出す前に、そのサイトにログインする必要があります。

そのため、これを Flash アプリで機能させるための最初の試みは、loadVars.sendAndLoad() を使用してログイン変数をログイン ページにポストすることでした。これにより、Cookie/セッション変数が設定され、「ログイン」ステータスが確立されます。その後、Flash アプリが ASP ページを呼び出して必要なデータを要求すると、すべてが機能します。言い換えると、最初のページへの loadVars.sendAndLoad 呼び出しでログインし、そのログイン ステータスが (何らかの方法で) 維持されるため、後で Flash アプリが ASP ページを呼び出したときに、ASP ページはまだログインしていると認識します。の。

Flash アプリケーションが別のドメインにデプロイされることを除いて、全体的に優れたソリューションです。つまり、ASP ページ (およびログイン ページ) は domainA.com にありますが、Flash アプリケーションは domainB.com にあります。また、Flash アプリは異なるドメインの URL を呼び出すことはできません (クロスドメイン ポリシー ファイルについては知っていますが、さまざまな理由から、それはオプションではありません)。

それで、私の次の考えはこれでした-cURLを使用してログイン変数をログインページに渡すPHPページをdomainB.comにセットアップします。cURL を使用して ASP ページを呼び出す別の PHP ページを domainB.com にセットアップします。

次に、「プロキシ」として機能する PHP ページを呼び出すように Flash アプリを設定できます。

ただし、これは機能しません。最初の PHP ページ (domainA.com のログイン ページに変数を渡すページ) を呼び出すと、それが機能すると思います。しかし、次に 2 番目の PHP ページを呼び出すと、domainA.com の ASP ページは、ログインしていないかのように要求を拒否します。

つまり、Flash からすべて実行すると、最初のリクエストから次のリクエストまで「ログイン」状態が維持されているように見えます。ただし、PHP ページからすべてを実行すると、ログイン状態が維持されません。

最初の PHP ページでシステムにログインしているようです。しかし、2 番目の PHP ページは、ログインしているとは認められていません。

この違いを説明する Cookie が Flash と PHP でどのように異なる方法で処理されるかについて何か考えはありますか?

アドバイスやガイダンスに基づいて、より詳細な情報を提供できることをうれしく思います。

よろしくお願いします!

- - 編集 - -

素晴らしいフィードバックと提案に基づいて、私はこれを機能させました。私はそれを磨く機会がありませんでした。一部の cURL オプションが不要または冗長である可能性があります。しかし、少なくとも、それは機能します。コードは次のとおりです。

<?php

    $ckfile = tempnam (".", "CURLCOOKIE");

    $url_1 = 'https://somedomain.com/loginService';
    $url_2 = 'https://somedomain.com/getMyData.asp';

    $fields_1 = array(
        'field1'=>"blah",
        'field2'=>"blah",
        'field3'=>"blah",
    );

    $fields_2 = array(
        'fieldX'=>"blah",
        'fieldY'=>"blah",
        'fieldZ'=>"blah",
    );


    $a='';
    $postvars_1 = '';
    foreach($fields_1 as $key=>$value) { 
        $postvars_1.= $a.urlencode($key).'='.urlencode($value); 
        $a='&'; 
    }

    $a='';
    $postvars_2 = '';
    foreach($fields_2 as $key=>$value) { 
        $postvars_2.= $a.urlencode($key).'='.urlencode($value); 
        $a='&'; 
    }

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);    
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);

    curl_setopt($ch, CURLOPT_URL, $url_1);
    curl_setopt($ch, CURLOPT_POST, count($fields_1));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_1);
    $result_1 = curl_exec($ch);

    curl_setopt($ch, CURLOPT_URL, $url_2);
    curl_setopt($ch, CURLOPT_POST, count($fields_2));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_2);
    $result_2 = curl_exec($ch);

    curl_close($ch);

    header("Content-type: text/xml");
    print $result_2;

    unlink($ckfile);

?>

言うまでもなく、これを達成するためのより良い方法や、コードに深刻な問題がある可能性があります。しかし、今のところ、働くことは何もしないよりはましです。コミュニティや以下の人々の助けがなければ、これを機能させることはできなかったでしょう。大変感謝します!

4

3 に答える 3

1

問題のスクリプトを貼り付けることができますか?

一見すると、Cookieがキャッチされて2番目のスクリプトに渡されていることを確認します(curl応答から取得され、2番目のリクエストのためにcurlに渡されます)。curlはCookieを自動的に処理しません(私は思いません)。 Webブラウザーの役割を果たし、応答ヘッダー(Cookieを含む)を保存します。

スクリプトは次のようになります。

<?php

    // first request

    $url = 'https://somedomain.com/login/';

    $fields = array(
        'field1'=>"aaaaa",
        'field2'=>"bbbbb",
        'field3'=>"ccccc"
    );

    $postvars = array();
    foreach($fields as $key=>$value) { 
        $postvars[] = urlencode($key).'='.urlencode($value); 
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&',$postvars));
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    preg_match('/^Set-Cookie: (.*?);/m', $result, $auth_value);
    curl_close($ch);

    // second request

    $url = 'https://somedomain.com/getMyData.asp';
    $fields = array(
        'fieldX'=>"xxxx",
        'fieldY'=>"yyyy",
        'fieldZ'=>"zzzz"
    );

    $postvars = array();
    foreach($fields as $key=>$value) { 
        $postvars[] = urlencode($key).'='.urlencode($value); 
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&',$postvars));
    curl_setopt($ch, CURLOPT_COOKIE, 'authenticate='.urlencode($auth_value[1]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);

    print $result;


?>

これは、最初のリクエストでヘッダーガフが戻ってきてもかまわないことを前提としています。

幸運を

于 2009-08-10T18:37:23.567 に答える
1

ログイン状態は、Cookieを使用して維持される可能性があります。PHPを介してプロキシする場合、リクエスト間にCookieは保存されません。これを回避するためのバロック的な方法がありますが(おそらくCookieをFlashに戻すことができます)、これはスケーラブルで耐久性のあるソリューションのようには思えません。クロスドメインポリシーを使用する方法や、ログインしているサイトにFlashが直接接続する他の方法(JSONコールバックなど)はありませんか?

于 2009-08-10T18:38:38.587 に答える
1

PHPは、フラッシュのように自動的にCookieを処理しません。投稿を行う関数、Cookieを詰め込むためのファイルへのパスを含むオプションのバッグに渡す必要があります。

オプションのバッグを作成する方法の説明は、http://usphp.com/manual/en/http.request.options.phpにあります。

于 2009-08-10T18:40:12.297 に答える