2011-08-08 13 views
2

私は基本認証を必要とするAPIに基づいて構築されたアプリケーションを構築しています。CURLセッション管理

curl_setopt($curl_handle, CURLOPT_COOKIEJAR, "cookie.txt"); 
curl_setopt($curl_handle, CURLOPT_COOKIEFILE, "cookie.txt"); 

私はセッションを維持しようとしている:私はこのように使用クッキージャーを使用しています、

を多くのコールを作り、私が作ったクラス内のCURLの要求を包まれていますクッキーを保存するためにcookie.txtを使用して、それは素晴らしい仕事をしています。しかし、今日私は驚くべき発見に出くわしました。他の誰か(別のコンピュータ上の)が自分のアプリに行くと、自分のセッション情報を見ることができます(おそらく、セッションの参照と同じファイルを使用しているためです)。私はおそらく私は各訪問者のための新しい "クッキージャー"を生成することができると思ったが、これはおそらく生産に行くときには機能しません。ユーザーの数は少なくとも数千人になるだろうから、これは訪問ごとにクッキーファイルが必要であることを意味すると思いますか?

これは実用的ではないようで、プログラムでCookieファイルを作成する必要はありません。他の誰かが前にこの問題を遭遇していますか?どんな提案も本当の助けになるでしょう。

多分訪問の間にクッキーを一意に配布するCURL setoptソリューションがありますか?

ありがとうございます!

+1

を使用すると、クッキーの話をしているので、私はあなたがどの「基本認証」を使用しているとは思わないが'http:// user:password @ website.com'のように見えます - あなたの問題は、通常APIがあなたにクッキーを送る必要がない理由を概説していると思います。これが唯一の方法だと確信していますか? – Halcyon

+0

こんにちはFrits、まあ私は提案しているが、私はAJAX呼び出しの上にアプリケーションを構築したいと思って、JSONPはヘッダーを取り除くので、HTTPS接続を介してAJAXで認証することは不可能です。 CURLを使用すると、CURLOPT_USERPWDを使用してユーザー名とパスワードを設定できます。 –

+0

基本認証を使用していない場合。 'https:// user:password @ secure.website.com' - AJAXを使いたいのであれば、なぜクッキーを使用していますか?今、混乱しています。 – Halcyon

答えて

1

あなたがしますcurl_setoptをオンにした場合は、ユーザーにクッキーを公開することができた場合($ curl_handle、CURLOPT_HEADER、1)カール幹部によって返されたヘッダは、コンテンツの上部に存在することになる、あなたはこれらを一致させることができコンテンツの最上部にあるURLを保持してクライアントブラウザに渡し、次のリクエストのためにカールするプロセスにユーザーのクッキーを戻します。

私はしばらく前に作られた何か原油:カールexecの後

if(is_array($_COOKIE)) 
    { 
    foreach($_COOKIE as $cookiename => $cookievalue) 
    { 
     if($cookievalue) 
     { 
     if(get_magic_quotes_gpc()) 
     { 
      $cookievalue = stripslashes($cookievalue); 
     } 
     $cookies[] = $cookiename .'='. urlencode($cookievalue); 
     } 
    } 
    if(is_array($cookies)) 
    { 
     curl_setopt($curl_handle, CURLOPT_COOKIE,implode('; ',$cookies)); 
    } 
    } 

preg_match_all('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si', $curl_result, $header_matches); 
    $headers = split("\r\n", str_replace("\r\n\r\n",'',array_pop($header_matches[0]))); 
    if(is_array($headers)) 
    { 
    foreach ($headers as $header) 
    { 
     preg_match('#(.*?)\:\s(.*)#', $header, $header_matches); 
     if(isset($header_matches[1])) 
     { 
     $headers[$header_matches[1]] = $header_matches[2]; 
     } 
     // SET THE COOKIE 
     if($header_matches[1] == 'Set-Cookie') 
     { 
     header('Set-Cookie: ' . $header_matches[2],false); 
     } 
    } 
    } 
    # Remove the headers from the response body 
    $curl_result = preg_replace('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si','',$curl_result); 
+0

他に何があったかを調べて、これが面白かったと思っただけです。http://svetlozar.net/page/free-code.html – Scuzzy

+1

基本的に、クライアントをクッキーを保存するビンとして使用していますか?巧妙だが厄介なこともあります:P – Halcyon

+0

CURLOPT_HEADERを使用するというコンセプトを採用していれば、jarファイルにクッキーを書き込むことなく、クッキーを抽出してDB化することができます。それは車両インベントリの一覧のみです。それ以外の場合は、各ユニークユーザーごとに異なるCURLOPT_COOKIEJARファイルを設定する必要があります。 :) – Scuzzy