2011-08-08 227 views
2

我正在構建基於需要基本身份驗證的API的應用程序。我交了很多電話和包裹類內部捲曲的請求,我做了,CURL會話管理

我使用cookie罐,我使用的是這樣的:

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

我想保持會話通過使用cookie.txt來存儲cookies並且它的工作效果很好。但是,今天我遇到了一個驚人的發現。當其他人(在另一臺計算機上)進入我的應用程序時,他們可以看到我的會話信息(可能是因爲它使用相同的文件作爲會話的參考)。我曾想過,也許我可以爲每個訪問者生成一個新的「餅乾罐子」,但這可能不適用於生產。用戶數量至少會達到數千人,所以我認爲這意味着每次訪問都需要cookie文件嗎?

這似乎不實際,更不用說我必須以編程方式創建cookie文件。有沒有人遇到過這個問題?任何建議將是一個真正的幫助。

也許有一個CURL setopt解決方案,可以在訪問中唯一地分發cookie?

謝謝!

+1

既然你在談論的cookies,我不認爲你正在使用「基本身份驗證」,這看起來像'http:// user:password @ website.com' - 我認爲你的問題概述了爲什麼通常API不需要你發送cookie。你確定這是唯一的方法嗎? – Halcyon

+0

嗨Frits,以及我打開的建議,但我想在AJAX調用的基礎上構建應用程序,據我所知,它是不可能通過HTTPS連接的AJAX進行身份驗證,因爲JSONP剝離標題。 CURL允許我使用CURLOPT_USERPWD設置用戶名和密碼。 –

+0

如果您使用的是基本身份驗證,則不適用。它可以在https上正常工作,例如:'https:// user:password @ secure.website.com' - 如果您想使用AJAX,那麼您爲什麼使用cookie?我現在很困惑。 – Halcyon

回答

1

如果你打開curl_setopt可以公開cookie的用戶($ curl_handle,CURLOPT_HEADER,1)由捲曲EXEC返回的標題將出現在內容的頂部,你可以搭配這些出並將其傳遞給客戶端瀏覽器進行保留,然後通過curl過程將任何用戶cookie傳回給下一個請求。

好聽的我前一陣子做:捲曲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

所以基本上你使用客戶端作爲一個bin來存儲cookie?聰明但有點討厭:P – Halcyon

+0

那麼,如果你只是使用CURLOPT_HEADER的概念,你可以自己提取和DB數據庫,而不必訴諸寫入jar文件,很高興我的情況不是任務關鍵和它只適用於車輛庫存清單。否則,你幾乎不得不爲每個唯一用戶設置不同的CURLOPT_COOKIEJAR文件。 :) – Scuzzy