পিএইচপি এর মাধ্যমে HTTP প্রমাণীকরণ লগআউট


151

এইচটিটিপি প্রমাণীকরণ সুরক্ষিত ফোল্ডারটি লগ আউট করার সঠিক উপায় কী ?

এগুলি অর্জন করতে পারে এমন ওয়ার্কআরউন্ডস রয়েছে তবে এগুলি সম্ভবত বিপজ্জনক কারণ তারা বগী হতে পারে বা নির্দিষ্ট পরিস্থিতিতে / ব্রাউজারগুলিতে কাজ করে না। এজন্য আমি সঠিক এবং পরিষ্কার সমাধানের সন্ধান করছি।


আপনার লগআউট জন্য উদ্দেশ্য নির্দিষ্ট করুন। এটি কি জোর করে লগআউট (ব্যবহারকারী-নিষ্ক্রিয়করণ) হওয়া উচিত? ব্যবহারকারীর জন্য সহজ লগআউট ফাংশন? আর কিছু?
কার্স্টেন

6
আমি বুঝতে পারি না কেন এটি গুরুত্বপূর্ণ, তবে এটি উভয় ক্ষেত্রেই: প্রয়োগের অভ্যন্তরীণ অবস্থার পাশাপাশি আদর্শ লগআউট বোতামের ভিত্তিতে নিষ্ক্রিয়করণ। কেন এটি গুরুত্বপূর্ণ তা দয়া করে ব্যাখ্যা করুন, আমি এটিকে সরাসরি প্রশ্নের মধ্যে সম্পাদনা করব।
জোসেফ সাবল

2
"সঠিক এবং পরিষ্কার সমাধান" ব্রাউজারগুলির নিজস্ব লগআউট বোতাম থাকবে যা ক্লিক করা হলে ব্রাউজারটি এথ শিরোনামগুলি পাঠানো বন্ধ করে দেবে ... কেউ স্বপ্ন দেখতে পারে, তাই না?
ড্যানমান

1
ওয়েব বিকাশকারী সরঞ্জামদণ্ডে এ জাতীয় "বোতাম" রয়েছে।
জোসেফ সোবল

জোসেফ যা বলেছিল: ফায়ারফক্সের জন্য ওয়েব বিকাশকারী সরঞ্জামদণ্ড ->Miscellaneous -> Clear Private Data -> HTTP Authentication
ইয়ারিন

উত্তর:


103

মু। কোনও সঠিক উপায় বিদ্যমান নেই , এমনকি ব্রাউজারগুলিতে সুসংগত একটিও নয়।

এটি এমন একটি সমস্যা যা HTTP স্পেসিফিকেশন (বিভাগ 15.6) থেকে আসে :

বিদ্যমান HTTP ক্লায়েন্ট এবং ব্যবহারকারী এজেন্ট সাধারণত অনির্দিষ্টকালের জন্য প্রমাণীকরণের তথ্য ধরে রাখে। HTTP- র / 1.1। এই ক্যাশে শংসাপত্রগুলি বাতিল করার জন্য ক্লায়েন্টদের নির্দেশ দেওয়ার জন্য কোনও সার্ভারের জন্য কোনও পদ্ধতি সরবরাহ করে না।

অন্যদিকে, বিভাগ 10.4.2 বলছে:

যদি অনুরোধটিতে ইতিমধ্যে অনুমোদনের শংসাপত্রগুলি অন্তর্ভুক্ত থাকে তবে 401 প্রতিক্রিয়াটি নির্দেশ করে যে সেই শংসাপত্রগুলির জন্য অনুমোদন প্রত্যাখ্যান করা হয়েছে। যদি 401 এর প্রতিক্রিয়া পূর্বের প্রতিক্রিয়াটির মতো একই চ্যালেঞ্জ ধারণ করে এবং ব্যবহারকারী এজেন্ট ইতিমধ্যে কমপক্ষে একবার প্রমাণীকরণের চেষ্টা করেছে, তবে ব্যবহারকারীর প্রতিক্রিয়াতে দেওয়া সত্তা উপস্থাপন করা উচিত, যেহেতু সেই সত্তায় প্রাসঙ্গিক ডায়াগোনস্টিক তথ্য অন্তর্ভুক্ত থাকতে পারে।

অন্য কথায়, আপনি আবার লগইন বাক্সটি দেখাতে সক্ষম হতে পারেন (যেমন @ কার্স্টেন বলেছেন), তবে ব্রাউজারটি আপনার অনুরোধটিকে সম্মান জানাতে হবে না - সুতরাং এটি খুব বেশি (ভুল) বৈশিষ্ট্যের উপর নির্ভর করবে না।


9
এটি আরএফসিতে একটি বাগ। ডাব্লু 3 সি ঠিক করতে খুব অলস। খুব দুঃখজনক.
এরিক অ্যারোনস্টি

@ জোনাথান হ্যানসন নীচে প্রস্তাবিত হিসাবে , আপনি HTTP প্রমাণীকরণের পাশাপাশি একটি ট্র্যাকিং কুকি ব্যবহার করতে পারেন। এটি আমার জন্য সেরা পদ্ধতি।
machineaddict

61

সাফারিতে দুর্দান্তভাবে কাজ করার পদ্ধতি। ফায়ারফক্স এবং অপেরাতেও কাজ করে তবে একটি সতর্কতা সহ।

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

এটি ব্রাউজারকে নতুন ব্যবহারকারীর সাথে ইউআরএল খুলতে বলেছে, পূর্ববর্তীটিকে ওভাররাইড করে।


14
আরএফসি 3986 (ইউআরআই: জেনেরিক সিনট্যাক্স) বিভাগ অনুসারে 3.2.1। (ব্যবহারকারীর তথ্য) এর ব্যবহার user:password@hostহ্রাস করা হয়েছে। শুধুমাত্র ব্যবহার http://logout@yourserver.example.com/না করা বেশিরভাগ ক্ষেত্রেই কাজ করা উচিত।
এফ

1
@ এবং হোঃ হ্যাঁ, এটি একটি পুনর্নির্দেশ। আপনার এটি 302 স্ট্যাটাস সহ ব্যবহার করা উচিত
কর্নেল

1
স্পষ্টতই লগআউট@ইউসরসর.এক্সামেল.কমের একটি সাধারণ লিঙ্ক পিএইচপি-তে কোনও HTTP পুনর্নির্দেশের পরিবর্তে (এই ইউআরএলটির একটি "সংযোগ বিচ্ছিন্ন") কাজ করে ... এর কোনও খারাপ দিক?
মোয়ালা

4
সতর্ক থাকুন: ফরম জমা আপেক্ষিক পাথ ব্যবহার যখন এটি একটি পুনরায় লগইন (লগ-আউট প্রম্পট লগইন) পর সম্পন্ন করা হয় ব্যর্থ হতে পারে, কারণ ঠিকানাটি এখনো হবে logout@yourserver.example.com/path এবং yourserver.example.com/path /
জেসন

1
logout@yourserver.example.com ক্রোমে হোয়াইটআউট ইস্যুতে কাজ করে, তবে ফায়ারফক্সে একটি সুরক্ষা প্রশ্ন জিজ্ঞাসা করে। লগআউট: true@yourserver.example.com ডোজ ফায়ারফক্সকে একটি সুরক্ষার প্রশ্নে পরিণত করে না। দুটি ইউআরএলের কোনওটিই আইই 8 তে কাজ করে না: /
থোর এ। প্যাডারসেন

46

এর সহজ উত্তরটি হ'ল আপনি নির্ভরযোগ্যভাবে http-প্রমাণীকরণ থেকে লগ আউট করতে পারবেন না।

দীর্ঘ উত্তর:
এইচটিপি-আউথ (বাকি এইচটিটিপি স্পেকের মতো) রাষ্ট্রহীন বলে বোঝানো হয়েছে। সুতরাং "লগ ইন করা" বা "লগ আউট" হওয়া সত্যিকার অর্থে একটি ধারণা নয়। এটি দেখার আরও ভাল উপায় হ'ল প্রতিটি HTTP অনুরোধের জন্য (এবং মনে রাখবেন যে কোনও পৃষ্ঠা লোড সাধারণত একাধিক অনুরোধ), "আপনি যা অনুরোধ করছেন তা করার অনুমতি কি আপনার দেওয়া আছে?" সার্ভার প্রতিটি অনুরোধটিকে নতুন হিসাবে দেখায় এবং পূর্ববর্তী কোনও অনুরোধের সাথে সম্পর্কিত নয়।

ব্রাউজারগুলি প্রথম 401-এ আপনি যে শংসাপত্রগুলি বলেছিলেন তা মনে রাখতে পছন্দ করেছেন এবং পরবর্তী অনুরোধগুলিতে ব্যবহারকারীর স্পষ্ট অনুমতি ব্যতীত সেগুলি পুনরায় প্রেরণ করবেন। এটি ব্যবহারকারীদের "লগ-ইন / লগ-আউট" মডেল দেওয়ার প্রত্যাশার একটি প্রচেষ্টা, তবে এটি নিখুঁতভাবে ক্লডজ। রাষ্ট্রের এই অধ্যবসায়ের অনুকরণকারী এটি ব্রাউজার । ওয়েব সার্ভার এটি সম্পর্কে সম্পূর্ণ অজানা।

সুতরাং "লগ আউট", http-auth এর প্রসঙ্গে নিখুঁতভাবে ব্রাউজারের সরবরাহ করা একটি সিমুলেশন এবং তাই সার্ভারের কর্তৃত্বের বাইরে।

হ্যাঁ, এখানে ক্লাডেজ রয়েছে। তবে তারা বিশ্রাম-নেছা (যদি এটি আপনার পক্ষে মূল্যবান হয়) ভঙ্গ করে এবং তারা অবিশ্বস্ত।

আপনার সাইটের প্রমাণীকরণের জন্য যদি আপনার একেবারে লগ-ইন / লগ-আউট মডেলের প্রয়োজন হয় তবে সর্বোত্তম বাজি হ'ল একটি ট্র্যাকিং কুকি, কোনওভাবে সার্ভারে স্টেট স্টেটের অধ্যবসায়ের সাথে (মাইএসকিএল, স্ক্লাইট, ফ্ল্যাটফিল ইত্যাদি)। এটি পিএইচপি সহ উদাহরণস্বরূপ, সমস্ত অনুরোধের মূল্যায়ন করা প্রয়োজন।


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>

উপরে যা করা হয় তা হ'ল:

  • আই -এর জন্য - কেবল প্রমাণীকরণ ক্যাশে পরিষ্কার করুন এবং কোথাও পুনর্নির্দেশ করুন

  • অন্যান্য ব্রাউজারগুলির জন্য - 'লগআউট' লগইন নাম এবং পাসওয়ার্ড সহ দৃশ্যের পিছনে একটি এক্সএমএলএইচটিপিআরকেস্ট প্রেরণ করুন। আমাদের এটি এমন কোনও পথে প্রেরণ করা দরকার যা সেই অনুরোধে 200 ওকে ফিরে আসবে (যেমন এটির HTTP প্রমাণীকরণের প্রয়োজন হবে না)।

প্রতিস্থাপন '/where/to/redirect'লগ আউট পর পুনর্চালনা এবং প্রতিস্থাপন করতে কিছু পাথ দিয়ে '/path/that/will/return/200/OK'আপনার সাইটের কিছু পথ যা 200 ঠিক আছে ফিরে আসবে না।


5
অন্য ব্যবহারকারী হিসাবে লগইন করার জন্য এটি কিছুটা কাজের সমাধান। তবে এটি আসলে কাজ করে এবং আরও creditণের দাবিদার।
চার্লি রুডেনস্টাল

2
আমি মনে করি এটি সেরা উত্তর। অনুরূপ প্রশ্নের এই উত্তরে বর্ণিত হিসাবে পাসওয়ার্ডটি এলোমেলো করার কিছু সুবিধা থাকতে পারে।
জেলানিক্স

2
এটি আমি চেয়েছিলাম - কোনও সমস্যা ছাড়াই সমস্ত ব্রাউজারে কাজ করেছি। আমি উত্তরাধিকারসূত্রে প্রাপ্ত "লগআউট" পৃষ্ঠাটি রেখেছি। আমি অগত্যা জেএস ব্যবহার করতে চাইনি (সম্ভবত অযৌক্তিকভাবে), তবে অন্যান্য উত্তরগুলির মধ্যে ক্রস-ব্রাউজার সংক্রান্ত সমস্যা ছিল এবং এটি নিখুঁতভাবে কাজ করেছিল।
ডিজিগ

আমি এই কাজটি করতে পারি না যেভাবে ব্যাখ্যা করা হয়েছে। যখন আমি সুরক্ষিত জায়গায় ফিরে যাই, ব্রাউজারটি শিরোনামে সর্বশেষ ব্যবহৃত বৈধ শংসাপত্রগুলি প্রেরণ করে আবার নিজেকে প্রমাণীকরণ করে। তবে, কিছুটা পরিবর্তন নিয়ে এটি আমার পক্ষে কাজ করে worked আমি সুরক্ষিত অঞ্চলের একই ক্ষেত্রের সাথে শিরোনাম দিয়ে 200 ওকে প্রতিক্রিয়া পরিবর্তন করেছি, তবে কেবলমাত্র "লগআউট: লগআউট" ব্যবহারকারী / পাসকে গ্রহণ করছি। এইভাবে, ব্যবহারকারী এই "লগআউট" ব্যবহারকারীর সাথে লগ ইন করেছেন এবং এটি সেই ব্যবহারকারী যা তিনি সুরক্ষিত অঞ্চলে ফিরে গেলে পুনরায় চেষ্টা করে। সুরক্ষিত অঞ্চল এই ব্যবহারকারী / পাসকে প্রত্যাখ্যান করে, যাতে ব্যবহারকারী তার শংসাপত্রগুলি পরিবর্তন করতে পারেন।
জোনগেরা

2
এটি ব্যাখ্যা করা হিসাবে কাজ করে না। ক্রোম 40 এবং Firefox 35 পরীক্ষিত
funforums

13

পরিশ্রম (কোনও পরিষ্কার, সুন্দর নয় (এমনকি কাজ করার জন্যও মন্তব্য দেখুন)) সমাধান:

একবার তার শংসাপত্রগুলি অক্ষম করুন।

আপনি যথাযথ শিরোনাম (লগ ইন না থাকলে) প্রেরণ করে আপনার এইচটিটিপি প্রমাণীকরণ যুক্তি পিএইচপি-তে স্থানান্তর করতে পারেন:

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 বেসিক অ্যাথ থেকে লগআউট

আসুন ধরা যাক আমার কাছে একটি "এইচটিপি বেসিক অ্যাথ রিয়েল" রয়েছে যার নাম "পাসওয়ার্ড সুরক্ষিত" রয়েছে, এবং বব লগ ইন রয়েছে log লগ আউট করতে আমি 2 টি এজেএক্স অনুরোধ করছি:

  1. অ্যাক্সেস স্ক্রিপ্ট / লগআউট_স্টেপ 1। এটি .htusers এ একটি এলোমেলো অস্থায়ী ব্যবহারকারী যুক্ত করে এবং এর লগইন এবং পাসওয়ার্ড দিয়ে প্রতিক্রিয়া জানায়।
  2. অ্যাক্সেস স্ক্রিপ্ট / লগআউট_স্টেপ 2 অস্থায়ী ব্যবহারকারীর লগইন এবং পাসওয়ার্ড দিয়ে প্রমাণীকৃত । স্ক্রিপ্ট অস্থায়ী ব্যবহারকারীকে মুছে ফেলে এবং প্রতিক্রিয়াটিতে এই শিরোনামটি যুক্ত করে: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
ফায়ারফক্সের জন্য ওয়েব বিকাশকারী সরঞ্জামদণ্ড এক্সটেনশন এইচটিটিপি প্রমাণীকরণগুলি মুছতে বৈশিষ্ট্য সরবরাহ করে। তবে এটি প্রশ্নের বাইরে নয় কারণ আমরা সত্যই আমাদের ব্যবহারকারীদের এফএফ এক্সটেনশানগুলি ডাউনলোড করতে বা ক্রিপ্টিক ব্রাউজারের কমান্ডগুলি চালাতে বলতে পারি না :-)
জোসেফ সাবল

2
ফায়ারফক্সের ডিফল্ট এইচটিটিপি লগ থেকে লগ আউট করার পদ্ধতি "সরঞ্জাম"> "সাম্প্রতিক ইতিহাস সাফ করুন ..." এর অধীনে চেকবক্স "অ্যাক্টিভ লগইনস" হিসাবে উপলব্ধ। এটি স্বজ্ঞাত নয় এবং এটি আপনাকে কেবল একটি ডোমেন থেকে লগ আউট করার অনুমতি দেয় না, আপনি সর্বদা প্রতিটি পৃষ্ঠা থেকে লগ আউট করতে পারেন।
এফ

2

ট্র্যাক - ডিফল্টরূপে - HTTP প্রমাণীকরণও ব্যবহার করে। লগআউট কাজ করে না এবং এটি ঠিক করা যায় না:

  • এটি নিজেই এইচটিটিপি প্রমাণীকরণ প্রকল্পের একটি সমস্যা এবং এটি সঠিকভাবে ঠিক করার জন্য ট্র্যাকের মধ্যে আমরা কিছুই করতে পারি না।
  • বর্তমানে কোনও বড় কাজ (জাভাস্ক্রিপ্ট বা অন্যান্য) নেই যা সমস্ত বড় ব্রাউজারগুলির সাথে কাজ করে।

থেকে: http://trac.edgewall.org/ticket/791#comment103

দেখে মনে হচ্ছে যে প্রশ্নের কোনও কার্যকরী উত্তর নেই, এই সমস্যাটি সাত বছর আগে রিপোর্ট করা হয়েছে এবং এটি সঠিক ধারণা দেয়: এইচটিটিপি রাষ্ট্রহীন। হয় অনুরোধ প্রমাণীকরণের শংসাপত্র দিয়ে সম্পন্ন হয় বা হয় না। তবে এটি ক্লায়েন্টের অনুরোধটি প্রেরণ করার বিষয়টি, সার্ভারটি এটি গ্রহণ করে না। সার্ভারটি কেবল তখনই বলতে পারে যদি কোনও অনুরোধ ইউআরআইয়ের অনুমোদনের প্রয়োজন হয় বা না।


2

আমার .htaccess অনুমোদনের পুনরায় সেট করার দরকার ছিল তাই আমি এটি ব্যবহার করেছি:

<?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.htp-auth.php

চিত্রে যান.

বেশ কয়েকটি সমাধান সেই পৃষ্ঠাতে থাকে এবং এটি নীচে নোট করে: লিঙ্কস, অন্যান্য ব্রাউজারগুলির মতো লেখককে সাফ করে না;)

আমি এটি আমার ইনস্টল করা ব্রাউজারগুলিতে পরীক্ষা করে দেখেছিলাম এবং একবার বন্ধ হয়ে গেলে, প্রতিটি ব্রাউজারের মনে হয় যে এটি পুনরুক্তিতে নিয়মিত পুনর্বার প্রয়োজন।


এটি কাজ করছে বলে মনে হচ্ছে না, আমি কোনও পপ-আপ লগইন বাক্স ছাড়াই বাতিল পাঠ্য পেয়ে যাচ্ছি।
মাইকেল 18

দেখা যাচ্ছে, প্রেরণ WWW-Authenticateকরা সমস্যার কারণ হয়ে দাঁড়িয়েছিল, আমাকে স্বয়ংক্রিয়ভাবে লগ আউট করে ছাড়িয়েছে।
মাইকেল 18

এবং বিপরীতক্রমে, মনে হচ্ছে যে না পাঠানোর WWW-Authenticateএকটি ব্রাউজারে (যেমন, Chrome) সমস্যা ফিক্সিং যখন পরিচয়পত্র স্মরণ এবং পরবর্তী অনুরোধে তাদের পাঠান, একটি স্বয়ংক্রিয় পুনরায় লগইন ফলে আরেকটি ব্রাউজার (ফায়ারফক্স) ঘটায়! আহা!
মাইকেল

তারপরে ইউএ দেখুন এবং একটি বা
অন্যটিকে

2

এটি সমাধান হিসাবে সন্ধান করা নাও হতে পারে তবে আমি এটি এর মতো সমাধান করেছি। লগআউট প্রক্রিয়াটির জন্য আমার কাছে 2 টি স্ক্রিপ্ট রয়েছে।

logout.php,

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

log.php

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

এইভাবে আমি কোনও সতর্কতা পেতে পারি না এবং আমার সেশনটি বন্ধ হয়ে যায়


1
সত্যিই আমার পক্ষে কাজ করা একমাত্র সমাধান ছিল! ফায়ারফক্স 37 এবং ক্রোমিয়াম 41
জেসেভার

1

আফাইক, এইচটিসেস (যেমন এইচটিটিপি ভিত্তিক) প্রমাণীকরণ ব্যবহার করার সময় কোনও "লগআউট" ফাংশন বাস্তবায়নের কোনও পরিষ্কার উপায় নেই।

কারণ এই জাতীয় প্রমাণীকরণটি HTTP ত্রুটি কোড '401' ব্যবহার করে ব্রাউজারকে শংসাপত্রগুলি প্রয়োজন তা জানাতে, সেই সময়ে ব্রাউজারটি ব্যবহারকারীকে বিশদের জন্য অনুরোধ করে। তারপরে, ব্রাউজারটি বন্ধ না হওয়া পর্যন্ত এটি সর্বদা আরও প্রম্পট না করে শংসাপত্রগুলি প্রেরণ করবে।


1

আমি এখনও অবধি সবচেয়ে ভাল সমাধানটি খুঁজে পেয়েছি (এটি ছদ্ম-কোডের ধরণ, এটি $isLoggedInএইচটিপি লেখার জন্য সিউডো ভেরিয়েবল):

"লগআউট" এর সময় সেশনটিতে কেবল কিছু তথ্য সঞ্চয় করে বলুন যে ব্যবহারকারী আসলে লগ আউট হয়েছে।

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 মৌলিক প্রমাণীকরণটি বিশ্রামের সময়, সেশনগুলি হয় না।
deamon

1

সম্ভবত আমি বিন্দু মিস করছি।

HTTP প্রমাণীকরণ শেষ করার সবচেয়ে নির্ভরযোগ্য উপায়টি হ'ল ব্রাউজার এবং সমস্ত ব্রাউজার উইন্ডো বন্ধ করা। আপনি জাভাস্ক্রিপ্ট ব্যবহার করে একটি ব্রাউজার উইন্ডো বন্ধ করতে পারেন তবে আমি মনে করি না যে আপনি সমস্ত ব্রাউজার উইন্ডো বন্ধ করতে পারেন।


FYI কিছু ব্রাউজার হবে একটি উইন্ডো থাকেন তাহলে সেটি শুধুমাত্র ট্যাব খোলা, তাই বিন্দু তর্ক করা সত্যিই বন্ধ না
SCAPE

বহু বছর আগে আমার উইন্ডোটি বন্ধ না করেই লগআউট বোতামটি বাস্তবায়নের কাজ ছিল :-) তবে সম্ভবত তারা "উইন্ডোটি বন্ধ না করে" মনে করবে না। তবে ওহে, এটি এমন সহজ সমাধান যা কারও পক্ষে কার্যকর হতে পারে এবং আমি সত্যবাদী হওয়ার জন্য এটিটি ফিরে পেয়েছিলাম।
জোসেফ সাবল

1

শুধুমাত্র কার্যকর উপায় আমি করেছেন, সে মুছা পাওয়া PHP_AUTH_DIGESTবা PHP_AUTH_USERPHP_AUTH_PWপরিচয়পত্র হেডার কল হয় HTTP/1.1 401 Unauthorized

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

0

অন্যরা যখন ঠিক বলেছেন যে বেসিক http প্রমাণীকরণ থেকে লগআউট করা অসম্ভব সেখানে প্রমাণীকরণ কার্যকর করার উপায় রয়েছে যা একইভাবে আচরণ করে। একটি স্পষ্ট অ্যাপিওচ হ'ল auth_memcookie ব্যবহার করা । আপনি যদি সত্যিই বেসিক এইচটিটিপি প্রমাণীকরণ প্রয়োগ করতে চান (যেমন HTTP ফর্মের চেয়ে ট্র্যাটারে লগ ইন করার জন্য ব্রাউজার ডায়লগগুলি ব্যবহার করুন) - কেবল একটি পৃথক .htaccess সুরক্ষিত ডিরেক্টরিতে প্রমাণীকরণটি সেট করুন যা পিএইচপি স্ক্রিপ্ট রয়েছে যা পুনরায় পুনর্নির্দেশ করে যেখানে ব্যবহারকারী এসেছিল মেমক্যাস সেশন তৈরি করা হচ্ছে।


0

এখানে অনেক দুর্দান্ত - জটিল - উত্তর রয়েছে। আমার বিশেষ ক্ষেত্রে আমি লগআউটটির জন্য একটি পরিষ্কার এবং সহজ সমাধান খুঁজে পেয়েছি। এজতে আমার এখনও পরীক্ষা নেই। আমার পৃষ্ঠায় আমি লগ ইন করেছি, আমি এর অনুরূপ একটি লগআউট লিঙ্কটি রেখেছি:

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

এবং সেই লগআউট.এইচটিএমএল পৃষ্ঠার শিরোনামে (এটি .htaccess দ্বারা সুরক্ষিত) আমার এই পৃষ্ঠার অনুরূপ একটি পৃষ্ঠা রিফ্রেশ রয়েছে:

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

আপনি সাইটের জন্য ক্যাশেড ব্যবহারকারীর নাম এবং পাসওয়ার্ড সাফ করার জন্য "লগআউট" শব্দটি যেখানে রেখে যাবেন।

আমি স্বীকার করব যে একাধিক পৃষ্ঠাগুলি যদি প্রথম থেকেই সরাসরি লগ ইন করতে সক্ষম হয় তবে প্রবেশের এই পয়েন্টগুলির প্রত্যেকটির নিজস্ব লগআউট html পৃষ্ঠা প্রয়োজন। অন্যথায় আপনি প্রকৃত লগইন প্রম্পটের আগে প্রক্রিয়াটিতে অতিরিক্ত গেটকিপার পদক্ষেপ প্রবর্তন করে লগআউটকে কেন্দ্রিয় করতে পারেন, লগইনের গন্তব্যে পৌঁছানোর জন্য একটি বাক্যাংশের প্রবেশের প্রয়োজন।


1
এগিয়ে যাওয়ার সময়, এটি কাজ করে, এটি লগ আউট করে না, তবে ব্রাউজারের ফিরে ইতিহাস এখনও সেশনটি পুনরায় প্রতিষ্ঠিত করতে পারে।
জনওয়েন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.