PHP के माध्यम से HTTP प्रमाणीकरण लॉगआउट


151

HTTP प्रमाणीकरण संरक्षित फ़ोल्डर से लॉग आउट करने का सही तरीका क्या है ?

ऐसे वर्कअराउंड हैं जो इसे प्राप्त कर सकते हैं, लेकिन वे संभावित रूप से खतरनाक हैं क्योंकि वे कुछ स्थितियों / ब्राउज़रों में छोटी गाड़ी हो सकते हैं या काम नहीं कर सकते हैं। यही कारण है कि मैं सही और साफ समाधान की तलाश में हूं।


कृपया अपने लॉगआउट का उद्देश्य निर्दिष्ट करें। क्या यह एक मजबूर लॉगआउट (उपयोगकर्ता-निष्क्रियता) होना चाहिए? उपयोगकर्ता के लिए सरल लॉगआउट फ़ंक्शन? और कुछ?
करस्टेन

6
मुझे समझ में नहीं आता कि यह क्यों मायने रखता है, लेकिन यह दोनों मामले हैं: आवेदन में आंतरिक स्थितियों के साथ-साथ विशिष्ट लॉगआउट बटन के आधार पर निष्क्रिय करना। कृपया बताएं कि यह क्यों महत्वपूर्ण है, मैं इसे सीधे प्रश्न में संपादित करूंगा।
जोसेफ सलैब

2
"सही और साफ समाधान" अपने स्वयं के लॉगआउट बटन वाले ब्राउज़र होंगे, जिन्हें क्लिक करने पर, ब्राउज़र को हेडर भेजना बंद कर दिया जाएगा ... एक सपना देख सकता है, है ना?
डैनमैन

1
वेब डेवलपर टूलबार में ऐसा "बटन" है।
जोसेफ सलैब

जोसेफ ने क्या कहा: फ़ायरफ़ॉक्स के लिए वेब डेवलपर टूलबार ->Miscellaneous -> Clear Private Data -> HTTP Authentication
यारिन

जवाबों:


103

म्यू। कोई सही तरीका मौजूद नहीं है , एक भी ऐसा नहीं है जो ब्राउज़रों के अनुरूप है।

यह एक समस्या है जो HTTP विनिर्देशन (धारा 15.6) से आती है :

मौजूदा HTTP क्लाइंट और उपयोगकर्ता एजेंट आमतौर पर प्रमाणीकरण जानकारी को अनिश्चित काल तक बनाए रखते हैं। HTTP / 1.1। इन कैश्ड क्रेडेंशियल्स को छोड़ने के लिए क्लाइंट को निर्देशित करने के लिए एक सर्वर के लिए एक विधि प्रदान नहीं करता है।

दूसरी ओर, खंड 10.4.2 कहता है:

यदि अनुरोध में पहले से ही प्राधिकरण क्रेडेंशियल शामिल हैं, तो 401 प्रतिक्रिया इंगित करती है कि उन क्रेडेंशियल्स के लिए प्राधिकरण से इनकार कर दिया गया है। यदि 401 प्रतिक्रिया में पूर्व प्रतिक्रिया के समान चुनौती है, और उपयोगकर्ता एजेंट ने पहले से ही कम से कम एक बार प्रमाणीकरण का प्रयास किया है, तो उपयोगकर्ता को उस इकाई को प्रस्तुत किया जाना चाहिए जो प्रतिक्रिया में दी गई थी, क्योंकि उस इकाई में प्रासंगिक नैदानिक ​​जानकारी शामिल हो सकती है।

दूसरे शब्दों में, आप लॉगिन बॉक्स को फिर से दिखाने में सक्षम हो सकते हैं (जैसा कि @Karsten कहते हैं), लेकिन ब्राउज़र को आपके अनुरोध का सम्मान करने की आवश्यकता नहीं है - इसलिए इस (गलत) सुविधा पर बहुत अधिक निर्भर न करें।


9
यह RFC में एक बग है। W3C भी ठीक करने के लिए आलसी। बहुत दुख की बात।
एरिक क्रोनिटी

जैसा कि @ जोनाथन हैंसन ने नीचे सुझाया है , आप HTTP प्रमाणीकरण के साथ ट्रैकिंग कुकी का उपयोग कर सकते हैं। यह मेरे लिए सबसे अच्छा तरीका है।
मशिनहेडिक जूल

61

वह विधि जो सफारी में अच्छी तरह से काम करती है। फ़ायरफ़ॉक्स और ओपेरा में भी काम करता है, लेकिन एक चेतावनी के साथ।

Location: http://logout@yourserver.example.com/

यह ब्राउज़र को पिछले उपयोगकर्ता को ओवरराइड करते हुए नए उपयोगकर्ता नाम के साथ URL खोलने के लिए कहता है।


14
RFC 3986 (URI: Generic Syntax) के अनुसार धारा 3.2.1। (उपयोगकर्ता जानकारी) का उपयोग user:password@hostपदावनत किया जाता है। केवल http://logout@yourserver.example.com/का उपयोग करना और ज्यादातर मामलों में काम नहीं करना चाहिए।
अनफ

1
@andho: हाँ, यह एक अनुप्रेषित है। आपको इसे 302 स्थिति के साथ उपयोग करना चाहिए।
कोर्नेल

1
जाहिरा तौर पर logout@yourserver.example.com पर एक सरल लिंक भी काम करता है (PHP में http रीडायरेक्ट के बजाय इस URL के लिए "इस URL के लिए लिंक" एक "डिस्कनेक्ट करें")?
मूला

4
सावधान: फ़ॉर्म सबमिशन रिश्तेदार पथ का उपयोग कर जब यह एक पुन: प्रवेश (लॉगआउट शीघ्र साथ प्रवेश) के बाद किया जाता है असफल हो सकता है, क्योंकि पता अभी भी होगा logout@yourserver.example.com/path और नहीं yourserver.example.com/path /
जेसन

1
logout@yourserver.example.com क्रोम में व्हाइटआउट समस्या का काम करता है, लेकिन फ़ायरफ़ॉक्स में एक सुरक्षा विचलन का संकेत देता है। logout: true@yourserver.example.com खुराक फ़ायरफ़ॉक्स प्रोम को सुरक्षा कवच नहीं बनाती है। IE8 में दोनों में से कोई भी url काम नहीं करता: /
Thor A. Pedersen

46

इसका सरल उत्तर यह है कि आप विश्वसनीय रूप से http-प्रमाणीकरण से लॉग आउट नहीं कर सकते हैं।

दीर्घ उत्तर:
Http-Cort (बाकि HTTP युक्ति की तरह) स्टेटलेस होना है। तो "लॉग इन" या "लॉग आउट" होना वास्तव में एक अवधारणा नहीं है जो समझ में आता है। इसे देखने का बेहतर तरीका यह है कि प्रत्येक HTTP रिक्वेस्ट के लिए (और एक पेज लोड आमतौर पर कई अनुरोधों को याद रखें), "क्या आपको वह करने की अनुमति है जो आप अनुरोध कर रहे हैं?"। सर्वर प्रत्येक अनुरोध को नए और किसी भी पिछले अनुरोधों के साथ असंबंधित देखता है।

ब्राउज़रों ने आपके द्वारा पहले 401 पर बताई गई क्रेडेंशियल्स को याद रखने के लिए चुना है, और बाद के अनुरोधों पर उपयोगकर्ता की स्पष्ट अनुमति के बिना उन्हें फिर से भेजें। यह उपयोगकर्ता को "लॉग इन / लॉग आउट" मॉडल देने की कोशिश है जो वे उम्मीद करते हैं, लेकिन यह पूरी तरह से एक कीचड़ है। यह ब्राउज़र है जो राज्य की इस दृढ़ता का अनुकरण कर रहा है। वेब सर्वर इससे पूरी तरह अनभिज्ञ है।

तो "लॉगिंग आउट", HTTP- के संदर्भ में विशुद्ध रूप से ब्राउज़र द्वारा प्रदान किया गया एक सिमुलेशन है, और इसलिए सर्वर के अधिकार से बाहर है।

हां, कीचड़ हैं। लेकिन वे रेस्टफुल-नेस को तोड़ते हैं (यदि आपके लिए यह मूल्य है) और वे अविश्वसनीय हैं।

यदि आपको अपनी साइट प्रमाणीकरण के लिए एक लॉग-इन / लॉग-आउट मॉडल की आवश्यकता है, तो सबसे अच्छी शर्त एक ट्रैकिंग कुकी है, जिसमें सर्वर पर संग्रहीत स्टेट की दृढ़ता बनी रहती है (mysql, sqlite, flatfile, आदि)। इसके लिए सभी अनुरोधों का मूल्यांकन करना होगा, उदाहरण के लिए, PHP के साथ।


26

वैकल्पिक हल

आप जावास्क्रिप्ट का उपयोग करके ऐसा कर सकते हैं:

<html><head>
<script type="text/javascript">
function logout() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
          xmlhttp = new XMLHttpRequest();
    }
    // code for IE
    else if (window.ActiveXObject) {
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (window.ActiveXObject) {
      // IE clear HTTP Authentication
      document.execCommand("ClearAuthenticationCache");
      window.location.href='/where/to/redirect';
    } else {
        xmlhttp.open("GET", '/path/that/will/return/200/OK', true, "logout", "logout");
        xmlhttp.send("");
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {window.location.href='/where/to/redirect';}
        }


    }


    return false;
}
</script>
</head>
<body>
<a href="#" onclick="logout();">Log out</a>
</body>
</html>

ऊपर क्या किया गया है:

  • IE के लिए - बस स्पष्ट कैश और कहीं न कहीं पुनर्निर्देशित करें

  • अन्य ब्राउज़रों के लिए - 'लॉगआउट' लॉगिन नाम और पासवर्ड के साथ पर्दे के पीछे एक XMLHttpRequest भेजें। हमें इसे कुछ पथ पर भेजने की आवश्यकता है जो उस अनुरोध पर 200 ठीक लौटेगा (अर्थात इसमें HTTP प्रमाणीकरण की आवश्यकता नहीं होनी चाहिए)।

'/where/to/redirect'लॉग आउट करने के बाद रीडायरेक्ट करने के लिए कुछ पथ से बदलें और '/path/that/will/return/200/OK'अपनी साइट पर कुछ पथ से प्रतिस्थापित करें जो 200 ओके लौटेगा।


5
यह कुछ हद तक एक अन्य उपयोगकर्ता के रूप में लॉगिन करने के लिए वर्कअराउंड है। लेकिन यह वास्तव में काम करता है और अधिक क्रेडिट का हकदार है।
चार्ली रुडेनस्टेल

2
मुझे लगता है कि यह सबसे अच्छा जवाब है। जैसा कि इस प्रश्न के उत्तर में कहा गया है कि पासवर्ड को रैंडमाइज करने के लिए कुछ लाभ हो सकते हैं।
zelanix

2
यह वही था जो मैं चाहता था - बिना किसी समस्या के सभी ब्राउज़रों में काम किया। "लॉगआउट" पृष्ठ को मैंने बरकरार रखा है। मैं जरूरी नहीं कि जेएस (शायद तर्कहीन) का उपयोग करना चाहता था, लेकिन अन्य सभी जवाबों में क्रॉस-ब्राउज़र समस्याएं थीं और यह एकदम सही था।
dgig

जिस तरह से समझाया गया है मैं यह काम नहीं कर सकता। जब मैं सुरक्षित क्षेत्र में वापस गया, तो ब्राउज़र हेडर में अंतिम उपयोग किए गए वैध क्रेडेंशियल्स भेजने के साथ फिर से खुद को प्रमाणित करता है। हालांकि, थोड़े बदलाव के साथ इसने मेरे लिए काम किया। मैंने एक सुरक्षित क्षेत्र के एक ही दायरे के साथ हेडर के साथ 200 ओके प्रतिक्रिया को बदल दिया, लेकिन केवल "लॉगआउट: लॉगआउट" उपयोगकर्ता / पास को स्वीकार किया। इस तरह, उपयोगकर्ता ने इस "लॉगआउट" उपयोगकर्ता के साथ लॉग इन किया, और यह वह उपयोगकर्ता है जो सुरक्षित क्षेत्र में वापस जाने पर पीछे हट जाता है। सुरक्षित क्षेत्र इस उपयोगकर्ता / पास को अस्वीकार कर देता है, इसलिए उपयोगकर्ता अपनी साख बदल सकता है।
जोंगुएरा

2
यह काम नहीं करता है जैसा कि यह समझाया गया है। Chrome 40 और फ़ायरफ़ॉक्स 35 में परीक्षण किया गया।
funforums

13

वर्कअराउंड (एक साफ, अच्छा नहीं है (या काम भी कर रहे हैं! टिप्पणियों को देखें) समाधान):

एक बार उसकी साख को अक्षम करें।

आप अपने HTTP प्रमाणीकरण तर्क को उचित हेडर (यदि लॉग इन नहीं है) भेजकर PHP में स्थानांतरित कर सकते हैं:

Header('WWW-Authenticate: Basic realm="protected area"');
Header('HTTP/1.0 401 Unauthorized');

और इनपुट के साथ पार्स करना:

$_SERVER['PHP_AUTH_USER'] // httpauth-user
$_SERVER['PHP_AUTH_PW']   // httpauth-password

तो उसकी साख को अक्षम करते हुए एक समय तुच्छ होना चाहिए।


18
इस समाधान के साथ समस्या यह है कि: आप आईई को यह बताने देते हैं कि क्रेडेंशियल्स ठीक नहीं हैं। यह खाली फ़ील्ड (पासवर्ड मैनेजर में संग्रहीत मान नहीं दिखा रहा है) के साथ लॉगिन संवाद प्रदर्शित करता है। लेकिन जब आप पृष्ठ को रद्द करते हैं और ताज़ा करते हैं, तो यह संग्रहीत क्रेडेंशियल्स भेजता है, इस प्रकार फिर से लॉगिंग करता है।
जोसेफ स्लैब

downvoted; जोसेफ सेबल ने टिप्पणी की, यह समस्या को हल नहीं करता है।
क्रिस वेसलिंग

7

HTTP बेसिक ऑथेंट से लॉगआउट दो चरणों में

मान लें कि मेरे पास "पासवर्ड प्रोटेक्टेड" नाम का एक HTTP बेसिक ऑथोरियल है, और बॉब लॉग इन है। लॉग आउट करने के लिए मैं 2 AJAX लिंक बनाता हूं:

  1. एक्सेस स्क्रिप्ट / logout_step1। यह एक यादृच्छिक अस्थायी उपयोगकर्ता को .htusers में जोड़ता है और इसके लॉगिन और पासवर्ड के साथ प्रतिक्रिया करता है।
  2. पहुँच स्क्रिप्ट / logout_step2 अस्थायी उपयोगकर्ता के लॉगिन और पासवर्ड के साथ प्रमाणित है । स्क्रिप्ट अस्थायी उपयोगकर्ता को हटा देती है और प्रतिक्रिया पर इस शीर्षक को जोड़ती है:WWW-Authenticate: Basic realm="Password protected"

इस बिंदु पर ब्राउज़र बॉब की साख भूल गया।


1
वाह! यह वास्तव में सरासर आविष्कार के लिए एक +1 का हकदार है, भले ही यह करने के लिए पूरी तरह से पागल हो।
एंडी ट्रिग्स

7

समस्या का मेरा समाधान निम्नलिखित है। आप फ़ंक्शन पा सकते हैं http_digest_parse, $realmऔर $usersइस पृष्ठ के दूसरे उदाहरण में: http://php.net/manual/en/features.http-auth.php

session_start();

function LogOut() {
  session_destroy();
  session_unset($_SESSION['session_id']);
  session_unset($_SESSION['logged']);

  header("Location: /", TRUE, 301);   
}

function Login(){

  global $realm;

  if (empty($_SESSION['session_id'])) {
    session_regenerate_id();
    $_SESSION['session_id'] = session_id();
  }

  if (!IsAuthenticated()) {  
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
   '",qop="auth",nonce="'.$_SESSION['session_id'].'",opaque="'.md5($realm).'"');
    $_SESSION['logged'] = False;
    die('Access denied.');
  }
  $_SESSION['logged'] = True;  
}

function IsAuthenticated(){
  global $realm;
  global $users;


  if  (empty($_SERVER['PHP_AUTH_DIGEST']))
      return False;

  // check PHP_AUTH_DIGEST
  if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
     !isset($users[$data['username']]))
     return False;// invalid username


  $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
  $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);

  // Give session id instead of data['nonce']
  $valid_response =   md5($A1.':'.$_SESSION['session_id'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

  if ($data['response'] != $valid_response)
    return False;

  return True;
}

4

आमतौर पर, एक बार एक ब्राउज़र ने उपयोगकर्ता को क्रेडेंशियल के लिए कहा है और उन्हें एक विशेष वेब साइट पर आपूर्ति की है, यह बिना किसी बहुत अधिक समय के लिए ऐसा करना जारी रखेगा। विभिन्न तरीकों से आप ग्राहक की ओर से कुकीज़ को साफ़ कर सकते हैं, मुझे ब्राउज़र को इसकी आपूर्ति किए गए प्रमाणीकरण क्रेडेंशियल्स को भूलने के लिए पूछने का एक समान तरीका नहीं पता है।


मेरा मानना ​​है कि जब आप फ़ायरफ़ॉक्स में "निजी डेटा हटाएं" का चयन करते हैं तो प्रमाणित सत्रों को हटाने का एक विकल्प है
क्रिस्टियन जे।

1
इसके अलावा फ़ायरफ़ॉक्स के लिए वेब डेवलपर टूलबार एक्सटेंशन HTTP प्रमाणीकरण को हटाने की सुविधा प्रदान करता है। लेकिन यह सवाल से बाहर है क्योंकि हम वास्तव में अपने उपयोगकर्ताओं को एफएफ एक्सटेंशन डाउनलोड करने या गुप्त ब्राउज़र आदेशों को चलाने के लिए नहीं कह सकते हैं :-)
जोसेफ सेबल

2
HTTP टूल से लॉग आउट करने का फ़ायरफ़ॉक्स का डिफ़ॉल्ट तरीका "टूल्स"> "क्लियर हाल हिस्ट्री ..." के तहत उपलब्ध है, चेकबॉक्स "एक्टिव डिनर" के रूप में। यह न तो सहज है और न ही यह आपको केवल एक डोमेन से लॉग आउट करने की अनुमति देता है, आप हर पृष्ठ से लॉग आउट करते हैं।
ऐफ

2

Trac - डिफ़ॉल्ट रूप से - साथ ही HTTP प्रमाणीकरण का उपयोग करता है। लॉगआउट काम नहीं करता है और इसे ठीक नहीं किया जा सकता है:

  • यह स्वयं HTTP प्रमाणीकरण योजना के साथ एक समस्या है, और इसे ठीक से ठीक करने के लिए हम Trac में कुछ भी नहीं कर सकते हैं।
  • वर्तमान में कोई वर्कअराउंड (जावास्क्रिप्ट या अन्य) नहीं है जो सभी प्रमुख ब्राउज़रों के साथ काम करता है।

प्रेषक: http://trac.edgewall.org/ticket/791#comment:103

ऐसा लगता है कि प्रश्न का कोई जवाब देने वाला काम नहीं है, सात साल पहले इस मुद्दे की सूचना दी गई है और यह सही समझ में आता है: HTTP स्टेटलेस है। या तो प्रमाणीकरण क्रेडेंशियल के साथ एक अनुरोध किया जाता है या नहीं। लेकिन यह क्लाइंट द्वारा रिक्वेस्ट भेजने की बात है, न कि इसे प्राप्त करने वाले सर्वर की। सर्वर केवल यह कह सकता है कि किसी अनुरोध पर URI को प्राधिकरण की आवश्यकता है या नहीं।


2

मुझे रीसेट करने की आवश्यकता है। इस तरह से मैंने इसे इस्तेमाल किया:

<?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;
}
?>

यहाँ पाया: http://php.net/manual/en/features.http-auth.php

जाओ पता लगाओ।

उस पृष्ठ पर कई समाधान रहते हैं और यह नीचे भी नोट करता है: लिंक्स, अन्य संस्करणों की तरह स्थिति को स्पष्ट नहीं करता है;)

मैंने अपने इंस्टॉल किए गए ब्राउज़रों पर इसका परीक्षण किया और एक बार बंद होने के बाद, प्रत्येक ब्राउज़र को ऐसा लगता है कि इसे लगातार पुन: उपयोग करने के लिए आवश्यक है।


यह काम नहीं कर रहा है, मुझे बिना किसी पॉप-अप लॉगिन बॉक्स के रद्द पाठ मिल रहा है।
माइकल

बाहर जाता है, भेजने से WWW-Authenticateसमस्या पैदा हो रही थी, इससे छुटकारा पाने के लिए मुझे अपने आप लॉग आउट करना पड़ा।
माइकल

और इसके विपरीत, ऐसा लगता है कि एक ब्राउज़र (क्रोम) में समस्या को ठीक करते समय नहीं भेजना WWW-Authenticateएक अन्य ब्राउज़र (फ़ायरफ़ॉक्स) को क्रेडेंशियल्स को याद रखने और अगले अनुरोध पर भेजने का कारण बनता है, जिसके परिणामस्वरूप स्वत: पुनः लॉगिन होता है! अरे!
माइकल

फिर यूए को देखें और एक या दूसरे को एक समाधान की तरह लगता है
लेनार्ट रोलैंड

2

यह वह समाधान नहीं हो सकता है जिसकी तलाश थी लेकिन मैंने इसे इस तरह हल किया। मेरे पास लॉगआउट प्रक्रिया के लिए 2 स्क्रिप्ट हैं।

logout.php

<?php
header("Location: http://.@domain.com/log.php");
?>

log.php

<?php
header("location: https://google.com");
?>

इस तरह मुझे चेतावनी नहीं मिलती है और मेरा सत्र समाप्त हो जाता है


1
यह मेरे लिए वास्तव में एकमात्र समाधान था! फ़ायरफ़ॉक्स 37 और क्रोमियम 41 पर परीक्षण किया
zesaver

1

AFAIK, htaccess (यानी HTTP- आधारित) प्रमाणीकरण का उपयोग करते समय "लॉगआउट" फ़ंक्शन को लागू करने का कोई साफ तरीका नहीं है।

ऐसा इसलिए है क्योंकि ऐसा प्रमाणीकरण ब्राउज़र को यह बताने के लिए HTTP त्रुटि कोड '401' का उपयोग करता है कि क्रेडेंशियल्स की आवश्यकता होती है, जिस बिंदु पर ब्राउज़र उपयोगकर्ता को विवरण के लिए संकेत देता है। तब से, जब तक ब्राउज़र बंद नहीं हो जाता, तब तक वह हमेशा बिना अधिक संकेत दिए क्रेडेंशियल्स भेजेगा।


1

अब तक मुझे मिला सबसे अच्छा समाधान है (यह छद्म कोड की तरह है, $isLoggedInhttp स्थिति के लिए छद्म चर है):

"लॉगआउट" के समय, सत्र को कुछ जानकारी संग्रहीत करते हुए कहते हैं कि उपयोगकर्ता वास्तव में लॉग आउट है।

function logout()
{
  //$isLoggedIn = false; //This does not work (point of this question)
  $_SESSION['logout'] = true;
}

उस स्थान पर जहाँ मैं प्रमाणीकरण के लिए जाँच करता हूँ मैं स्थिति का विस्तार करता हूँ:

function isLoggedIn()
{
  return $isLoggedIn && !$_SESSION['logout'];
}

सत्र कुछ हद तक http प्रमाणीकरण की स्थिति से जुड़ा होता है इसलिए उपयोगकर्ता तब तक लॉग आउट रहता है जब तक वह ब्राउज़र को खुला रखता है और जब तक ब्राउज़र में http प्रमाणीकरण जारी रहता है।


4
जबकि http बेसिक प्रमाणीकरण RESTful है, सत्र नहीं हैं।
बहमन

1

शायद मुझे बात याद आ रही है।

HTTP प्रमाणीकरण को समाप्त करने का सबसे विश्वसनीय तरीका ब्राउज़र और सभी ब्राउज़र विंडो बंद करना है। आप जावास्क्रिप्ट का उपयोग करके एक ब्राउज़र विंडो बंद कर सकते हैं, लेकिन मुझे नहीं लगता कि आप सभी ब्राउज़र विंडो बंद कर सकते हैं।


फी कुछ ब्राउज़र विंडो को बंद नहीं करेंगे यदि यह एकमात्र टैब खुला है, तो यह बिंदु वास्तव में
लूट है

उन लंबे समय से पहले मुझे विंडो बंद किए बिना लॉगआउट बटन को लागू करने का काम मिला था :-) लेकिन शायद वे "खिड़की बंद नहीं" पर ध्यान केंद्रित नहीं करेंगे। लेकिन हे, यह सरल समाधान है जो किसी के लिए काम कर सकता है और मैं इसे फिर से याद किया ईमानदार होने के लिए।
जोसेफ स्लैब

1

केवल प्रभावी तरीका मैंने का सफाया करने के लिए मिला PHP_AUTH_DIGESTया PHP_AUTH_USERऔर PHP_AUTH_PWसाख हैडर कॉल करने के लिए है HTTP/1.1 401 Unauthorized

function clear_admin_access(){
    header('HTTP/1.1 401 Unauthorized');
    die('Admin access turned off');
}

0

जबकि अन्य यह कहने में सही हैं कि मूल http प्रमाणीकरण से लॉगआउट करना असंभव है, प्रमाणीकरण को लागू करने के तरीके हैं जो समान व्यवहार करते हैं। एक स्पष्ट appeoach dif_memcookie का उपयोग करना है । यदि आप वास्तव में बेसिक HTTP प्रमाणीकरण को लागू करना चाहते हैं (जैसे कि HTTP फॉर्म के बजाय ट्राउजर में लॉग इन करने के लिए ब्राउज़र संवादों का उपयोग करें) - बस प्रमाणीकरण को एक अलग स्क्रिप्ट के साथ सेट करें। एक PHP स्क्रिप्ट वाली एक सुरक्षित स्क्रिप्ट को निर्देशिका में रखें, जो उस जगह पर रीडायरेक्ट करती है जहां टी बाद आया था। संस्मरण सत्र का निर्माण।


0

यहां बहुत सारे महान - जटिल - उत्तर हैं। मेरे विशेष मामले में मुझे लॉगआउट के लिए एक साफ और सरल फिक्स मिला। मुझे एज में टेस्ट करना बाकी है। मैंने जिस पेज पर लॉग इन किया है, मैंने उसके समान एक लॉगआउट लिंक रखा है:

<a href="https://MyDomainHere.net/logout.html">logout</a>

और उस लॉगआउट। Html पेज के प्रमुख में (जो कि .htaccess द्वारा भी संरक्षित है) मेरे पास इसके जैसा एक पृष्ठ ताज़ा है:

<meta http-equiv="Refresh" content="0; url=https://logout:logout@MyDomainHere.net/" />

जहां आप साइट के लिए उपयोग किए गए उपयोगकर्ता नाम और पासवर्ड को खाली करने के लिए "लॉगआउट" शब्द छोड़ देंगे।

मैं स्वीकार करूंगा कि यदि आरंभ से ही कई पृष्ठों को सीधे लॉग-इन करने में सक्षम होने की आवश्यकता है, तो प्रवेश के उन बिंदुओं में से प्रत्येक को अपने स्वयं के संगत logout.html पृष्ठ की आवश्यकता होगी। अन्यथा आप वास्तविक लॉगिन प्रॉम्प्ट से पहले प्रक्रिया में एक अतिरिक्त द्वारपाल कदम शुरू करके लॉगआउट को केंद्रीकृत कर सकते हैं, जिससे लॉगिन के गंतव्य तक पहुंचने के लिए एक वाक्यांश के प्रवेश की आवश्यकता होती है।


1
आगे बढ़ने पर, यह काम करता है, यह लॉग आउट करता है, लेकिन ब्राउज़र बैक इतिहास अभी भी सत्र को फिर से स्थापित कर सकता है।
जॉनवेने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.