2011-03-02 17 views
10

इसलिए मैंने अपने आरईएसटी एपीआई के लिए पाचन HTTP प्रमाणीकरण का उपयोग करने का फैसला किया। मैंने इसे गुगल किया और पीएचपी मैनुअल में एक प्रविष्टि पाया कि इसका तरीका कैसे किया जाए। तो मैं स्क्रिप्ट की प्रतिलिपि बनाता हूं, इसे अपने सर्वर पर index.php में डालता हूं, ब्राउज़र में पेज खोलता हूं, मेरे क्रेडेंशियल दर्ज करने के बाद ब्राउज़र फिर से पूछता है और मैं क्रेडेंशियल दर्ज करने के अनंत लूप में फंस गया हूं। लिपि नीचे शामिल है और here पाया जा सकता है।PHP डाइजेस्ट HTTP प्रमाणीकरण उदाहरण काम नहीं कर रहा है, क्यों?

उदाहरण # 7 डाइजेस्ट HTTP प्रमाणीकरण उदाहरण

<?php 
$realm = 'Restricted area'; 

//user => password 
$users = array('admin' => 'mypass', 'guest' => 'guest'); 


if (empty($_SERVER['PHP_AUTH_DIGEST'])) { 
    header('HTTP/1.1 401 Unauthorized'); 
    header('WWW-Authenticate: Digest realm="'.$realm. 
      '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); 

    die('Text to send if user hits Cancel button'); 
} 


// analyze the PHP_AUTH_DIGEST variable 
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || 
    !isset($users[$data['username']])) 
    die('Wrong Credentials!'); 


// generate the valid response 
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]); 
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); 
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); 

if ($data['response'] != $valid_response) 
    die('Wrong Credentials!'); 

// ok, valid username & password 
echo 'Your are logged in as: ' . $data['username']; 


// function to parse the http auth header 
function http_digest_parse($txt) 
{ 
    // protect against missing data 
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1); 
    $data = array(); 
    $keys = implode('|', array_keys($needed_parts)); 

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER); 

    foreach ($matches as $m) { 
     $data[$m[1]] = $m[3] ? $m[3] : $m[4]; 
     unset($needed_parts[$m[1]]); 
    } 

    return $needed_parts ? false : $data; 
} 
?> 

मैं भी बुनियादी प्रमाणीकरण की कोशिश की और कहा कि पूरी तरह से काम किया।

उदाहरण # 6 बुनियादी HTTP प्रमाणीकरण उदाहरण

<?php 
if (!isset($_SERVER['PHP_AUTH_USER'])) { 
    header('WWW-Authenticate: Basic realm="My Realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo 'Text to send if user hits Cancel button'; 
    exit; 
} else { 
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; 
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>"; 
} 
?> 

ऐसा लगता है $_SERVER['PHP_AUTH_DIGEST'] हमेशा खाली है की तरह।

क्या स्क्रिप्ट के साथ कुछ गड़बड़ है या मेरा पर्यावरण फंकी है और यदि ऐसा है तो मैं इसे कैसे ठीक करूं?

संपादित करें: स्क्रिप्ट के साथ कुछ भी गलत नहीं है। गलती सर्वर के साथ निहित है। अगर कोई जानता है कि संभवतः इसका कारण क्या हो सकता है, तो कृपया मुझे बताएं।

+5

यदि इसकी कोई मदद है, तो मैंने उपरोक्त से अपना सटीक कोड लिया है और इसे अपने सर्वर पर एक परीक्षण पृष्ठ में रखा है और यह पूरी तरह से काम करता है (डाइजेस्ट ऑथ भाग), इसलिए यह किसी प्रकार का कॉन्फ़िगरेशन समस्या होना चाहिए। http://www.moditekka.com/phpauth.php – Infotekka

+0

इसके अलावा, क्या आप प्रयासों के बीच ब्राउज़र को पूरी तरह से बंद कर रहे हैं (सभी टैब, सभी विंडोज़)? यह आपके पहले प्रयास को कुकी में संग्रहीत करेगा और जब तक आप ऐसा नहीं करेंगे तब तक आपको फिर से संकेत नहीं देंगे। – Infotekka

+0

धन्यवाद, इन्फोटेक्का! अब मुझे यह पता लगाने की जरूरत है कि सर्वर के साथ क्या गलत है। –

उत्तर

5

डाइजेस्ट प्रमाणीकरण एक अलग अपाचे मॉड्यूल है कि अक्सर सर्वर पर स्थापित नहीं कर रहा है है - विशेष रूप से सस्ते होस्टिंग कंपनियों के साथ। हालांकि इसका उपयोग करने के लिए इसे सक्षम करने की आवश्यकता है।

http://httpd.apache.org/docs/current/mod/mod_auth_digest.html

यह है कि यह कैसे स्थापित करने के लिए, यदि आप लिनक्स का उपयोग कर रहे अपने वितरण पर निर्भर करता है। मेरे उबंटू लिनक्स पर यह के लिए पर्याप्त मॉड्यूल फ़ोल्डर से सक्रिय मॉड्यूल में मॉड्यूल का एक प्रतीकात्मक लिंक बना सकता है, एक खोल पर sudo a2enmod auth_digest चलाएं। वह, और निश्चित रूप से अपाचे को पुनरारंभ करना।

मुझे विंडोज़ के बारे में पता नहीं है।

1

क्या आपके पास mod_headers अपाचे के भीतर लोड किया गया है (मुझे लगता है कि आपका सर्वर अपाचे चलाता है)?

आप निम्न कमांड लाइन (जो निष्पादन विशेषाधिकार की आवश्यकता हो सकती) का उपयोग करके यह पता लगा सकता है:

httpd -M | grep head 
+0

लिंक टूटा हुआ है। मुझे यह कमांड लाइन कहां चलनी चाहिए (मुझे कौन सा फ़ोल्डर होना चाहिए?) –

+1

मैंने लिंक तय कर दिया है। यह आदेश आपकी वर्तमान निर्देशिका पर निर्भर नहीं है। अगर कुछ भी आउटपुट नहीं है, तो मॉड्यूल आपके सर्वर पर स्थापित नहीं किया गया है –

+0

क्या यह टुकड़ा विंडोज़ पर काम करता है? या लिनक्स केवल? (मैं यह खोजने की कोशिश कर रहा हूं कि मेरे पास यह स्थानीय है या नहीं। मैं win8 पर चल रहा हूं) –

संबंधित मुद्दे