How to log out user from web site using BASIC authentication?
up vote
233
down vote
favorite
Is it possible to log out user from a web site if he is using basic authentication?
Killing session is not enough, since, once user is authenticated, each request contains login info, so user is automatically logged in next time he/she access the site using the same credentials.
The only solution so far is to close browser, but that's not acceptable from the usability standpoint.
http authentication basic-authentication http-basic-authentication
add a comment |
up vote
233
down vote
favorite
Is it possible to log out user from a web site if he is using basic authentication?
Killing session is not enough, since, once user is authenticated, each request contains login info, so user is automatically logged in next time he/she access the site using the same credentials.
The only solution so far is to close browser, but that's not acceptable from the usability standpoint.
http authentication basic-authentication http-basic-authentication
1
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
14
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
13
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the/
page, they will automatically be logged in again.
– Ian Boyd
May 11 '16 at 19:22
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32
add a comment |
up vote
233
down vote
favorite
up vote
233
down vote
favorite
Is it possible to log out user from a web site if he is using basic authentication?
Killing session is not enough, since, once user is authenticated, each request contains login info, so user is automatically logged in next time he/she access the site using the same credentials.
The only solution so far is to close browser, but that's not acceptable from the usability standpoint.
http authentication basic-authentication http-basic-authentication
Is it possible to log out user from a web site if he is using basic authentication?
Killing session is not enough, since, once user is authenticated, each request contains login info, so user is automatically logged in next time he/she access the site using the same credentials.
The only solution so far is to close browser, but that's not acceptable from the usability standpoint.
http authentication basic-authentication http-basic-authentication
http authentication basic-authentication http-basic-authentication
edited Dec 16 '16 at 18:36
KyleMit
57.1k34234390
57.1k34234390
asked Oct 24 '08 at 13:21
Marko
21.7k1766103
21.7k1766103
1
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
14
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
13
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the/
page, they will automatically be logged in again.
– Ian Boyd
May 11 '16 at 19:22
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32
add a comment |
1
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
14
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
13
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the/
page, they will automatically be logged in again.
– Ian Boyd
May 11 '16 at 19:22
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32
1
1
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
14
14
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
13
13
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the
/
page, they will automatically be logged in again.– Ian Boyd
May 11 '16 at 19:22
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the
/
page, they will automatically be logged in again.– Ian Boyd
May 11 '16 at 19:22
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32
add a comment |
18 Answers
18
active
oldest
votes
up vote
146
down vote
accepted
Basic Authentication wasn't designed to manage logging out. You can do it, but not completely automatically.
What you have to do is have the user click a logout link, and send a ‘401 Unauthorized’ in response, using the same realm and at the same URL folder level as the normal 401 you send requesting a login.
They must be directed to input wrong credentials next, eg. a blank username-and-password, and in response you send back a “You have successfully logged out” page. The wrong/blank credentials will then overwrite the previous correct credentials.
In short, the logout script inverts the logic of the login script, only returning the success page if the user isn't passing the right credentials.
The question is whether the somewhat curious “don't enter your password” password box will meet user acceptance. Password managers that try to auto-fill the password can also get in the way here.
Edit to add in response to comment: re-log-in is a slightly different problem (unless you require a two-step logout/login obviously). You have to reject (401) the first attempt to access the relogin link, than accept the second (which presumably has a different username/password). There are a few ways you could do this. One would be to include the current username in the logout link (eg. /relogin?username), and reject when the credentials match the username.
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
|
show 2 more comments
up vote
181
down vote
An addition to the answer by bobince ...
With Ajax you can have your 'Logout' link/button wired to a Javascript function. Have this function send the XMLHttpRequest with a bad username and password. This should get back a 401. Then set document.location back to the pre-login page. This way, the user will never see the extra login dialog during logout, nor have to remember to put in bad credentials.
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
|
show 2 more comments
up vote
168
down vote
Have the user click on a link to https://log:out@example.com/. That will overwrite existing credentials with invalid ones; logging them out.
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
|
show 15 more comments
up vote
57
down vote
You can do it entirely in JavaScript:
IE has (for a long time) standard API for clearing Basic Authentication cache:
document.execCommand("ClearAuthenticationCache")
Should return true when it works. Returns either false, undefined or blows up on other browsers.
New browsers (as of Dec 2012: Chrome, FireFox, Safari) have "magic" behavior. If they see a successful basic auth request with any bogus other username (let's say logout
) they clear the credentials cache and possibly set it for that new bogus user name, which you need to make sure is not a valid user name for viewing content.
Basic example of that is:
var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')
An "asynchronous" way of doing the above is to do an AJAX call utilizing the logout
username. Example:
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("")
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m)
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
You can make it a bookmarklet too:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
1
Does this require special server-side handling of thelogout
username and/or logout URL?
– ulidtko
Oct 7 '13 at 19:30
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user calledlogout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.
– davidjb
Mar 20 '14 at 5:58
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
|
show 1 more comment
up vote
14
down vote
The following function is confirmed working for Firefox 40, Chrome 44, Opera 31 and IE 11.
Bowser is used for browser detection, jQuery is also used.
- secUrl is the url to a password protected area from which to log out.
- redirUrl is the url to a non password protected area (logout success page).
- you might wish to increase the redirect timer (currently 200ms).
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the$.ajax
variant being synchronous (async: false
) and thexmlhttp
variant being asynchronous (thetrue
inopen()
)?
– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change(bowser.gecko)
to(bowser.gecko || bowser.blink)
.
– Bowi
Sep 15 '17 at 14:10
1
Why does gecko/blink use$.ajax
and webkit usenew XMLHttpRequest
? Shouldn't gecko/blink be able to doXMLHttpRequest
and webkit be able to do$.ajax
too? I'm confused.
– RemyNL
Oct 31 at 12:13
add a comment |
up vote
10
down vote
This isn't directly possible with Basic-Authentication.
There's no mechanism in the HTTP specification for the server to tell the browser to stop sending the credentials that the user already presented.
There are "hacks" (see other answers) typically involving using XMLHttpRequest to send an HTTP request with incorrect credentials to overwrite the ones originally supplied.
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
add a comment |
up vote
9
down vote
Here's a very simple Javascript example using jQuery:
function logout(to_url) {
var out = window.location.href.replace(/:///, '://log:out@');
jQuery.get(out).error(function() {
window.location = to_url;
});
}
This log user out without showing him the browser log-in box again, then redirect him to a logged out page
As of jQuery 1.8, the.error()
method is deprecated and removed from 3.0 Use.fail()
instead.
– RemyNL
Oct 31 at 11:27
add a comment |
up vote
6
down vote
It's actually pretty simple.
Just visit the following in your browser and use wrong credentials:
http://username:password@yourdomain.com
That should "log you out".
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
add a comment |
up vote
5
down vote
This is working for IE/Netscape/Chrome :
function ClearAuthentication(LogOffPage)
{
var IsInternetExplorer = false;
try
{
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
}
catch(e)
{
IsInternetExplorer = false;
};
if (IsInternetExplorer)
{
// Logoff Internet Explorer
document.execCommand("ClearAuthenticationCache");
window.location = LogOffPage;
}
else
{
// Logoff every other browsers
$.ajax({
username: 'unknown',
password: 'WrongPassword',
url: './cgi-bin/PrimoCgi',
type: 'GET',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
},
error: function(err)
{
window.location = LogOffPage;
}
});
}
}
$(document).ready(function ()
{
$('#Btn1').click(function ()
{
// Call Clear Authentication
ClearAuthentication("force_logout.html");
});
});
add a comment |
up vote
2
down vote
function logout() {
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("msie") != -1) {
document.execCommand("ClearAuthenticationCache", false);
}
xhr_objectCarte = null;
if(window.XMLHttpRequest)
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
alert ("Your browser doesn't support XMLHTTPREQUEST");
xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
xhr_object.send ("");
xhr_object = null;
document.location = 'http://yourserver.com';
return false;
}
add a comment |
up vote
2
down vote
function logout(url){
var str = url.replace("http://", "http://" + new Date().getTime() + "@");
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4) location.reload();
}
xmlhttp.open("GET",str,true);
xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
xmlhttp.send();
return false;
}
add a comment |
up vote
1
down vote
add this to your application :
@app.route('/logout')
def logout():
return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
add a comment |
up vote
1
down vote
All you need is redirect user on some logout URL and return 401 Unauthorized
error on it. On error page (which must be accessible without basic auth) you need to provide a full link to your home page (including scheme and hostname). User will click this link and browser will ask for credentials again.
Example for Nginx:
location /logout {
return 401;
}
error_page 401 /errors/401.html;
location /errors {
auth_basic off;
ssi on;
ssi_types text/html;
alias /home/user/errors;
}
Error page /home/user/errors/401.html
:
<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
add a comment |
up vote
1
down vote
Based on what I read above I got a simple solution that works on any browser:
1) on you logout page you call an ajax to your login back end. Your login back end must accept logout user. Once the back end accept, the browser clear the current user and assumes the "logout" user.
$.ajax({
async: false,
url: 'http://your_login_backend',
type: 'GET',
username: 'logout'
});
setTimeout(function () {
window.location.href = 'http://normal_index';
}, 200);
2) Now when the user got back to the normal index file it will try to automatic enter in the system with the user "logout", on this second time you must block it by reply with 401 to invoke the login/password dialog.
3) There are many ways to do that, I created two login back ends, one that accepts the logout user and one that doesn't. My normal login page use the one that doesn't accept, my logout page use the one that accepts it.
add a comment |
up vote
0
down vote
- use a session ID (cookie)
- invalidate the session ID on the server
- Don't accept users with invalid session IDs
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
add a comment |
up vote
0
down vote
This JavaScript must be working for all latest version browsers:
//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;
//Clear Basic Realm Authentication
if(isIE){
//IE
document.execCommand("ClearAuthenticationCache");
window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("");
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m);
window.location = '/';
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
window.location = 'http://log:out@'+Host+'/';
}
add a comment |
up vote
0
down vote
I updated mthoring's solution for modern Chrome versions:
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit || bowser.chrome) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
add a comment |
up vote
0
down vote
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
add a comment |
protected by Community♦ Aug 3 '17 at 16:52
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
18 Answers
18
active
oldest
votes
18 Answers
18
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
146
down vote
accepted
Basic Authentication wasn't designed to manage logging out. You can do it, but not completely automatically.
What you have to do is have the user click a logout link, and send a ‘401 Unauthorized’ in response, using the same realm and at the same URL folder level as the normal 401 you send requesting a login.
They must be directed to input wrong credentials next, eg. a blank username-and-password, and in response you send back a “You have successfully logged out” page. The wrong/blank credentials will then overwrite the previous correct credentials.
In short, the logout script inverts the logic of the login script, only returning the success page if the user isn't passing the right credentials.
The question is whether the somewhat curious “don't enter your password” password box will meet user acceptance. Password managers that try to auto-fill the password can also get in the way here.
Edit to add in response to comment: re-log-in is a slightly different problem (unless you require a two-step logout/login obviously). You have to reject (401) the first attempt to access the relogin link, than accept the second (which presumably has a different username/password). There are a few ways you could do this. One would be to include the current username in the logout link (eg. /relogin?username), and reject when the credentials match the username.
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
|
show 2 more comments
up vote
146
down vote
accepted
Basic Authentication wasn't designed to manage logging out. You can do it, but not completely automatically.
What you have to do is have the user click a logout link, and send a ‘401 Unauthorized’ in response, using the same realm and at the same URL folder level as the normal 401 you send requesting a login.
They must be directed to input wrong credentials next, eg. a blank username-and-password, and in response you send back a “You have successfully logged out” page. The wrong/blank credentials will then overwrite the previous correct credentials.
In short, the logout script inverts the logic of the login script, only returning the success page if the user isn't passing the right credentials.
The question is whether the somewhat curious “don't enter your password” password box will meet user acceptance. Password managers that try to auto-fill the password can also get in the way here.
Edit to add in response to comment: re-log-in is a slightly different problem (unless you require a two-step logout/login obviously). You have to reject (401) the first attempt to access the relogin link, than accept the second (which presumably has a different username/password). There are a few ways you could do this. One would be to include the current username in the logout link (eg. /relogin?username), and reject when the credentials match the username.
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
|
show 2 more comments
up vote
146
down vote
accepted
up vote
146
down vote
accepted
Basic Authentication wasn't designed to manage logging out. You can do it, but not completely automatically.
What you have to do is have the user click a logout link, and send a ‘401 Unauthorized’ in response, using the same realm and at the same URL folder level as the normal 401 you send requesting a login.
They must be directed to input wrong credentials next, eg. a blank username-and-password, and in response you send back a “You have successfully logged out” page. The wrong/blank credentials will then overwrite the previous correct credentials.
In short, the logout script inverts the logic of the login script, only returning the success page if the user isn't passing the right credentials.
The question is whether the somewhat curious “don't enter your password” password box will meet user acceptance. Password managers that try to auto-fill the password can also get in the way here.
Edit to add in response to comment: re-log-in is a slightly different problem (unless you require a two-step logout/login obviously). You have to reject (401) the first attempt to access the relogin link, than accept the second (which presumably has a different username/password). There are a few ways you could do this. One would be to include the current username in the logout link (eg. /relogin?username), and reject when the credentials match the username.
Basic Authentication wasn't designed to manage logging out. You can do it, but not completely automatically.
What you have to do is have the user click a logout link, and send a ‘401 Unauthorized’ in response, using the same realm and at the same URL folder level as the normal 401 you send requesting a login.
They must be directed to input wrong credentials next, eg. a blank username-and-password, and in response you send back a “You have successfully logged out” page. The wrong/blank credentials will then overwrite the previous correct credentials.
In short, the logout script inverts the logic of the login script, only returning the success page if the user isn't passing the right credentials.
The question is whether the somewhat curious “don't enter your password” password box will meet user acceptance. Password managers that try to auto-fill the password can also get in the way here.
Edit to add in response to comment: re-log-in is a slightly different problem (unless you require a two-step logout/login obviously). You have to reject (401) the first attempt to access the relogin link, than accept the second (which presumably has a different username/password). There are a few ways you could do this. One would be to include the current username in the logout link (eg. /relogin?username), and reject when the credentials match the username.
edited Oct 24 '08 at 15:06
answered Oct 24 '08 at 13:33
bobince
439k89564765
439k89564765
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
|
show 2 more comments
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
2
2
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
I'll try this approach. The point of logout (in this case) is to enable user to log in as different user, so it is perfectly acceptable solution. As for auto-fill password, it is up to user if he will use it or not. Thanks
– Marko
Oct 24 '08 at 14:07
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
Is this still the only way? I've done an ASP.Net MVC and jQuery implementation that works, but I'm still not happy with it: stackoverflow.com/questions/6277919
– Keith
Jun 9 '11 at 7:51
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
@Keith: Still only this and systemPAUSE's answer (which doesn't work on all browsers, but is smoother than the manual approach when it does work).
– bobince
Jun 9 '11 at 21:49
12
12
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
The W3C is so active on the HTML spec. But the HTTP spec is languishing. W3C should have fixed this problem about two decades ago. With the rise in use of REST services, a robust native authentication method is need of the day.
– Dojo
Dec 1 '14 at 13:38
7
7
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
This doesn't appear to work properly in Chrome 46 browsing on localhost. Chrome appears to keep both the old (correct) password and the new password which you specify. After navigating to the logout page, chrome correctly uses the new password UNTIL IT ENCOUNTERS A 401 UNAUTHORIZED ON A PAGE ON YOUR SITE. After the first 401, Chrome reverts back to the old (correct) password. So it really didn't delete the password in the first place it seems.
– vancan1ty
Jan 8 '16 at 22:10
|
show 2 more comments
up vote
181
down vote
An addition to the answer by bobince ...
With Ajax you can have your 'Logout' link/button wired to a Javascript function. Have this function send the XMLHttpRequest with a bad username and password. This should get back a 401. Then set document.location back to the pre-login page. This way, the user will never see the extra login dialog during logout, nor have to remember to put in bad credentials.
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
|
show 2 more comments
up vote
181
down vote
An addition to the answer by bobince ...
With Ajax you can have your 'Logout' link/button wired to a Javascript function. Have this function send the XMLHttpRequest with a bad username and password. This should get back a 401. Then set document.location back to the pre-login page. This way, the user will never see the extra login dialog during logout, nor have to remember to put in bad credentials.
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
|
show 2 more comments
up vote
181
down vote
up vote
181
down vote
An addition to the answer by bobince ...
With Ajax you can have your 'Logout' link/button wired to a Javascript function. Have this function send the XMLHttpRequest with a bad username and password. This should get back a 401. Then set document.location back to the pre-login page. This way, the user will never see the extra login dialog during logout, nor have to remember to put in bad credentials.
An addition to the answer by bobince ...
With Ajax you can have your 'Logout' link/button wired to a Javascript function. Have this function send the XMLHttpRequest with a bad username and password. This should get back a 401. Then set document.location back to the pre-login page. This way, the user will never see the extra login dialog during logout, nor have to remember to put in bad credentials.
answered Jan 29 '09 at 18:56
system PAUSE
24.3k175458
24.3k175458
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
|
show 2 more comments
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
11
11
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
Good hack, having the user manually enter bad credentials is probably not acceptable for most webapps.
– BillMan
Mar 28 '11 at 14:08
1
1
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
Just make sure the XMLHttpRequest isn't set to be asynchronous or you may find that the redirection via will take place before the logout request completes.
– davidjb
Mar 20 '14 at 5:54
4
4
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
You can use the same trick for login as well. That way you can customize the login dialog without having to change the server's authentication method. This article gives some good ideas: http://www.peej.co.uk/articles/http-auth-with-html-forms.html
– Stijn de Witt
Apr 1 '14 at 11:12
1
1
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
@davidjb Since synchronous requests are considered deprecated now, an alternative solution might be to redirect the user in the callback of the async request.
– Hayden Schiff
Jul 31 '15 at 20:20
1
1
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
David: chrome now permits this for XHRs, and I can confirm that it is still working in chrome canary. bugs.chromium.org/p/chromium/issues/detail?id=435547
– CpnCrunch
May 25 '17 at 17:49
|
show 2 more comments
up vote
168
down vote
Have the user click on a link to https://log:out@example.com/. That will overwrite existing credentials with invalid ones; logging them out.
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
|
show 15 more comments
up vote
168
down vote
Have the user click on a link to https://log:out@example.com/. That will overwrite existing credentials with invalid ones; logging them out.
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
|
show 15 more comments
up vote
168
down vote
up vote
168
down vote
Have the user click on a link to https://log:out@example.com/. That will overwrite existing credentials with invalid ones; logging them out.
Have the user click on a link to https://log:out@example.com/. That will overwrite existing credentials with invalid ones; logging them out.
edited Sep 16 '14 at 11:13
Bergi
360k56535855
360k56535855
answered Oct 8 '13 at 21:28
Matthew Welborn
1,697172
1,697172
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
|
show 15 more comments
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
17
17
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
Why does this one not get more upvotes? Seems like a simple and working solution to me. Are there any known problems with this approach?
– amoebe
Jan 17 '14 at 14:00
24
24
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
This would no longer work in Chrome, which for security reasons ignores credentials in a URL.
– Thom
Jun 6 '14 at 9:49
5
5
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
This Worked for me :) I am using Chrome Version 32.0.1700.102
– abottoni
Aug 6 '14 at 13:28
5
5
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
problem: using version 39.0 of chrome, When I click the logout link via this method, Chrome remembers the bad login credentials, and prompts for new login credentials on every page load, until I go to example.com without any specified login credentials, to clear chrome's memory.
– Scott
Jan 23 '15 at 4:08
4
4
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
Hi, I cannot use it for https on Chrome.
– thienkhoi tran
Aug 28 '15 at 9:51
|
show 15 more comments
up vote
57
down vote
You can do it entirely in JavaScript:
IE has (for a long time) standard API for clearing Basic Authentication cache:
document.execCommand("ClearAuthenticationCache")
Should return true when it works. Returns either false, undefined or blows up on other browsers.
New browsers (as of Dec 2012: Chrome, FireFox, Safari) have "magic" behavior. If they see a successful basic auth request with any bogus other username (let's say logout
) they clear the credentials cache and possibly set it for that new bogus user name, which you need to make sure is not a valid user name for viewing content.
Basic example of that is:
var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')
An "asynchronous" way of doing the above is to do an AJAX call utilizing the logout
username. Example:
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("")
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m)
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
You can make it a bookmarklet too:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
1
Does this require special server-side handling of thelogout
username and/or logout URL?
– ulidtko
Oct 7 '13 at 19:30
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user calledlogout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.
– davidjb
Mar 20 '14 at 5:58
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
|
show 1 more comment
up vote
57
down vote
You can do it entirely in JavaScript:
IE has (for a long time) standard API for clearing Basic Authentication cache:
document.execCommand("ClearAuthenticationCache")
Should return true when it works. Returns either false, undefined or blows up on other browsers.
New browsers (as of Dec 2012: Chrome, FireFox, Safari) have "magic" behavior. If they see a successful basic auth request with any bogus other username (let's say logout
) they clear the credentials cache and possibly set it for that new bogus user name, which you need to make sure is not a valid user name for viewing content.
Basic example of that is:
var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')
An "asynchronous" way of doing the above is to do an AJAX call utilizing the logout
username. Example:
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("")
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m)
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
You can make it a bookmarklet too:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
1
Does this require special server-side handling of thelogout
username and/or logout URL?
– ulidtko
Oct 7 '13 at 19:30
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user calledlogout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.
– davidjb
Mar 20 '14 at 5:58
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
|
show 1 more comment
up vote
57
down vote
up vote
57
down vote
You can do it entirely in JavaScript:
IE has (for a long time) standard API for clearing Basic Authentication cache:
document.execCommand("ClearAuthenticationCache")
Should return true when it works. Returns either false, undefined or blows up on other browsers.
New browsers (as of Dec 2012: Chrome, FireFox, Safari) have "magic" behavior. If they see a successful basic auth request with any bogus other username (let's say logout
) they clear the credentials cache and possibly set it for that new bogus user name, which you need to make sure is not a valid user name for viewing content.
Basic example of that is:
var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')
An "asynchronous" way of doing the above is to do an AJAX call utilizing the logout
username. Example:
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("")
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m)
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
You can make it a bookmarklet too:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
You can do it entirely in JavaScript:
IE has (for a long time) standard API for clearing Basic Authentication cache:
document.execCommand("ClearAuthenticationCache")
Should return true when it works. Returns either false, undefined or blows up on other browsers.
New browsers (as of Dec 2012: Chrome, FireFox, Safari) have "magic" behavior. If they see a successful basic auth request with any bogus other username (let's say logout
) they clear the credentials cache and possibly set it for that new bogus user name, which you need to make sure is not a valid user name for viewing content.
Basic example of that is:
var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')
An "asynchronous" way of doing the above is to do an AJAX call utilizing the logout
username. Example:
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("")
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m)
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
You can make it a bookmarklet too:
javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);
edited Mar 1 '13 at 1:01
answered Jan 15 '13 at 1:46
ddotsenko
4,0811821
4,0811821
1
Does this require special server-side handling of thelogout
username and/or logout URL?
– ulidtko
Oct 7 '13 at 19:30
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user calledlogout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.
– davidjb
Mar 20 '14 at 5:58
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
|
show 1 more comment
1
Does this require special server-side handling of thelogout
username and/or logout URL?
– ulidtko
Oct 7 '13 at 19:30
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user calledlogout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.
– davidjb
Mar 20 '14 at 5:58
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
1
1
Does this require special server-side handling of the
logout
username and/or logout URL?– ulidtko
Oct 7 '13 at 19:30
Does this require special server-side handling of the
logout
username and/or logout URL?– ulidtko
Oct 7 '13 at 19:30
1
1
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user called
logout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.– davidjb
Mar 20 '14 at 5:58
@ulidtko No, it shouldn't - all handling is client-side. The only situation that would need special handling is if a user called
logout
happens to exist and happens to have the generated password. In that almost impossibly-rare case, change the user ID to one that won't exist in your system.– davidjb
Mar 20 '14 at 5:58
1
1
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used the bookmarklet above today and I works well.
– David Gleba
May 13 '15 at 12:51
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
I used this and it worked for Chrome and FF. I only had to do an extra "GET" on my logout.php page to clear the $_SESSION.
– urban
Oct 9 '15 at 10:08
The bookmarklet works on Edge, too. Simply use with
<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
The bookmarklet works on Edge, too. Simply use with
<a href='javascript:......need*/);'>Logout</a>
– Eric
Nov 30 '15 at 6:57
|
show 1 more comment
up vote
14
down vote
The following function is confirmed working for Firefox 40, Chrome 44, Opera 31 and IE 11.
Bowser is used for browser detection, jQuery is also used.
- secUrl is the url to a password protected area from which to log out.
- redirUrl is the url to a non password protected area (logout success page).
- you might wish to increase the redirect timer (currently 200ms).
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the$.ajax
variant being synchronous (async: false
) and thexmlhttp
variant being asynchronous (thetrue
inopen()
)?
– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change(bowser.gecko)
to(bowser.gecko || bowser.blink)
.
– Bowi
Sep 15 '17 at 14:10
1
Why does gecko/blink use$.ajax
and webkit usenew XMLHttpRequest
? Shouldn't gecko/blink be able to doXMLHttpRequest
and webkit be able to do$.ajax
too? I'm confused.
– RemyNL
Oct 31 at 12:13
add a comment |
up vote
14
down vote
The following function is confirmed working for Firefox 40, Chrome 44, Opera 31 and IE 11.
Bowser is used for browser detection, jQuery is also used.
- secUrl is the url to a password protected area from which to log out.
- redirUrl is the url to a non password protected area (logout success page).
- you might wish to increase the redirect timer (currently 200ms).
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the$.ajax
variant being synchronous (async: false
) and thexmlhttp
variant being asynchronous (thetrue
inopen()
)?
– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change(bowser.gecko)
to(bowser.gecko || bowser.blink)
.
– Bowi
Sep 15 '17 at 14:10
1
Why does gecko/blink use$.ajax
and webkit usenew XMLHttpRequest
? Shouldn't gecko/blink be able to doXMLHttpRequest
and webkit be able to do$.ajax
too? I'm confused.
– RemyNL
Oct 31 at 12:13
add a comment |
up vote
14
down vote
up vote
14
down vote
The following function is confirmed working for Firefox 40, Chrome 44, Opera 31 and IE 11.
Bowser is used for browser detection, jQuery is also used.
- secUrl is the url to a password protected area from which to log out.
- redirUrl is the url to a non password protected area (logout success page).
- you might wish to increase the redirect timer (currently 200ms).
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
The following function is confirmed working for Firefox 40, Chrome 44, Opera 31 and IE 11.
Bowser is used for browser detection, jQuery is also used.
- secUrl is the url to a password protected area from which to log out.
- redirUrl is the url to a non password protected area (logout success page).
- you might wish to increase the redirect timer (currently 200ms).
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
answered Sep 1 '15 at 7:24
mthoring
14112
14112
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the$.ajax
variant being synchronous (async: false
) and thexmlhttp
variant being asynchronous (thetrue
inopen()
)?
– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change(bowser.gecko)
to(bowser.gecko || bowser.blink)
.
– Bowi
Sep 15 '17 at 14:10
1
Why does gecko/blink use$.ajax
and webkit usenew XMLHttpRequest
? Shouldn't gecko/blink be able to doXMLHttpRequest
and webkit be able to do$.ajax
too? I'm confused.
– RemyNL
Oct 31 at 12:13
add a comment |
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the$.ajax
variant being synchronous (async: false
) and thexmlhttp
variant being asynchronous (thetrue
inopen()
)?
– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change(bowser.gecko)
to(bowser.gecko || bowser.blink)
.
– Bowi
Sep 15 '17 at 14:10
1
Why does gecko/blink use$.ajax
and webkit usenew XMLHttpRequest
? Shouldn't gecko/blink be able to doXMLHttpRequest
and webkit be able to do$.ajax
too? I'm confused.
– RemyNL
Oct 31 at 12:13
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
this is the most comprehensive answer
– belidzs
Oct 21 '15 at 14:51
Is there any reason for the
$.ajax
variant being synchronous (async: false
) and the xmlhttp
variant being asynchronous (the true
in open()
)?– Bowi
Sep 14 '17 at 13:34
Is there any reason for the
$.ajax
variant being synchronous (async: false
) and the xmlhttp
variant being asynchronous (the true
in open()
)?– Bowi
Sep 14 '17 at 13:34
Chrome now uses the rendering engine Blink, so you have to change
(bowser.gecko)
to (bowser.gecko || bowser.blink)
.– Bowi
Sep 15 '17 at 14:10
Chrome now uses the rendering engine Blink, so you have to change
(bowser.gecko)
to (bowser.gecko || bowser.blink)
.– Bowi
Sep 15 '17 at 14:10
1
1
Why does gecko/blink use
$.ajax
and webkit use new XMLHttpRequest
? Shouldn't gecko/blink be able to do XMLHttpRequest
and webkit be able to do $.ajax
too? I'm confused.– RemyNL
Oct 31 at 12:13
Why does gecko/blink use
$.ajax
and webkit use new XMLHttpRequest
? Shouldn't gecko/blink be able to do XMLHttpRequest
and webkit be able to do $.ajax
too? I'm confused.– RemyNL
Oct 31 at 12:13
add a comment |
up vote
10
down vote
This isn't directly possible with Basic-Authentication.
There's no mechanism in the HTTP specification for the server to tell the browser to stop sending the credentials that the user already presented.
There are "hacks" (see other answers) typically involving using XMLHttpRequest to send an HTTP request with incorrect credentials to overwrite the ones originally supplied.
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
add a comment |
up vote
10
down vote
This isn't directly possible with Basic-Authentication.
There's no mechanism in the HTTP specification for the server to tell the browser to stop sending the credentials that the user already presented.
There are "hacks" (see other answers) typically involving using XMLHttpRequest to send an HTTP request with incorrect credentials to overwrite the ones originally supplied.
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
add a comment |
up vote
10
down vote
up vote
10
down vote
This isn't directly possible with Basic-Authentication.
There's no mechanism in the HTTP specification for the server to tell the browser to stop sending the credentials that the user already presented.
There are "hacks" (see other answers) typically involving using XMLHttpRequest to send an HTTP request with incorrect credentials to overwrite the ones originally supplied.
This isn't directly possible with Basic-Authentication.
There's no mechanism in the HTTP specification for the server to tell the browser to stop sending the credentials that the user already presented.
There are "hacks" (see other answers) typically involving using XMLHttpRequest to send an HTTP request with incorrect credentials to overwrite the ones originally supplied.
edited Oct 9 '15 at 10:25
answered Oct 24 '08 at 13:30
Alnitak
268k62336426
268k62336426
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
add a comment |
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
11
11
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
In Theory. Practice proves otherwise as can be seen from the other answers.
– Stijn de Witt
Apr 1 '14 at 11:14
2
2
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
And as you can also see from the other answers, not in a reliable, consistent and fail-safe way !
– jplandrain
Aug 21 '17 at 9:55
add a comment |
up vote
9
down vote
Here's a very simple Javascript example using jQuery:
function logout(to_url) {
var out = window.location.href.replace(/:///, '://log:out@');
jQuery.get(out).error(function() {
window.location = to_url;
});
}
This log user out without showing him the browser log-in box again, then redirect him to a logged out page
As of jQuery 1.8, the.error()
method is deprecated and removed from 3.0 Use.fail()
instead.
– RemyNL
Oct 31 at 11:27
add a comment |
up vote
9
down vote
Here's a very simple Javascript example using jQuery:
function logout(to_url) {
var out = window.location.href.replace(/:///, '://log:out@');
jQuery.get(out).error(function() {
window.location = to_url;
});
}
This log user out without showing him the browser log-in box again, then redirect him to a logged out page
As of jQuery 1.8, the.error()
method is deprecated and removed from 3.0 Use.fail()
instead.
– RemyNL
Oct 31 at 11:27
add a comment |
up vote
9
down vote
up vote
9
down vote
Here's a very simple Javascript example using jQuery:
function logout(to_url) {
var out = window.location.href.replace(/:///, '://log:out@');
jQuery.get(out).error(function() {
window.location = to_url;
});
}
This log user out without showing him the browser log-in box again, then redirect him to a logged out page
Here's a very simple Javascript example using jQuery:
function logout(to_url) {
var out = window.location.href.replace(/:///, '://log:out@');
jQuery.get(out).error(function() {
window.location = to_url;
});
}
This log user out without showing him the browser log-in box again, then redirect him to a logged out page
answered Jun 10 '14 at 12:35
Romuald Brunet
2,90422526
2,90422526
As of jQuery 1.8, the.error()
method is deprecated and removed from 3.0 Use.fail()
instead.
– RemyNL
Oct 31 at 11:27
add a comment |
As of jQuery 1.8, the.error()
method is deprecated and removed from 3.0 Use.fail()
instead.
– RemyNL
Oct 31 at 11:27
As of jQuery 1.8, the
.error()
method is deprecated and removed from 3.0 Use .fail()
instead.– RemyNL
Oct 31 at 11:27
As of jQuery 1.8, the
.error()
method is deprecated and removed from 3.0 Use .fail()
instead.– RemyNL
Oct 31 at 11:27
add a comment |
up vote
6
down vote
It's actually pretty simple.
Just visit the following in your browser and use wrong credentials:
http://username:password@yourdomain.com
That should "log you out".
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
add a comment |
up vote
6
down vote
It's actually pretty simple.
Just visit the following in your browser and use wrong credentials:
http://username:password@yourdomain.com
That should "log you out".
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
add a comment |
up vote
6
down vote
up vote
6
down vote
It's actually pretty simple.
Just visit the following in your browser and use wrong credentials:
http://username:password@yourdomain.com
That should "log you out".
It's actually pretty simple.
Just visit the following in your browser and use wrong credentials:
http://username:password@yourdomain.com
That should "log you out".
answered Feb 18 '15 at 18:59
Chiedo
4,10611820
4,10611820
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
add a comment |
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
But the user have to be a REAL user, othervise I got "401 Unauthorized", but using BACK button I am able to continue work as a previously logged user. Tested on Abyss web server X1 (2.11.1)
– user2956477
Dec 29 '16 at 10:39
1
1
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
Duplicate answer (see Matthew Welborn's above).
– Skippy le Grand Gourou
Sep 12 at 9:53
add a comment |
up vote
5
down vote
This is working for IE/Netscape/Chrome :
function ClearAuthentication(LogOffPage)
{
var IsInternetExplorer = false;
try
{
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
}
catch(e)
{
IsInternetExplorer = false;
};
if (IsInternetExplorer)
{
// Logoff Internet Explorer
document.execCommand("ClearAuthenticationCache");
window.location = LogOffPage;
}
else
{
// Logoff every other browsers
$.ajax({
username: 'unknown',
password: 'WrongPassword',
url: './cgi-bin/PrimoCgi',
type: 'GET',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
},
error: function(err)
{
window.location = LogOffPage;
}
});
}
}
$(document).ready(function ()
{
$('#Btn1').click(function ()
{
// Call Clear Authentication
ClearAuthentication("force_logout.html");
});
});
add a comment |
up vote
5
down vote
This is working for IE/Netscape/Chrome :
function ClearAuthentication(LogOffPage)
{
var IsInternetExplorer = false;
try
{
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
}
catch(e)
{
IsInternetExplorer = false;
};
if (IsInternetExplorer)
{
// Logoff Internet Explorer
document.execCommand("ClearAuthenticationCache");
window.location = LogOffPage;
}
else
{
// Logoff every other browsers
$.ajax({
username: 'unknown',
password: 'WrongPassword',
url: './cgi-bin/PrimoCgi',
type: 'GET',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
},
error: function(err)
{
window.location = LogOffPage;
}
});
}
}
$(document).ready(function ()
{
$('#Btn1').click(function ()
{
// Call Clear Authentication
ClearAuthentication("force_logout.html");
});
});
add a comment |
up vote
5
down vote
up vote
5
down vote
This is working for IE/Netscape/Chrome :
function ClearAuthentication(LogOffPage)
{
var IsInternetExplorer = false;
try
{
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
}
catch(e)
{
IsInternetExplorer = false;
};
if (IsInternetExplorer)
{
// Logoff Internet Explorer
document.execCommand("ClearAuthenticationCache");
window.location = LogOffPage;
}
else
{
// Logoff every other browsers
$.ajax({
username: 'unknown',
password: 'WrongPassword',
url: './cgi-bin/PrimoCgi',
type: 'GET',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
},
error: function(err)
{
window.location = LogOffPage;
}
});
}
}
$(document).ready(function ()
{
$('#Btn1').click(function ()
{
// Call Clear Authentication
ClearAuthentication("force_logout.html");
});
});
This is working for IE/Netscape/Chrome :
function ClearAuthentication(LogOffPage)
{
var IsInternetExplorer = false;
try
{
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
}
catch(e)
{
IsInternetExplorer = false;
};
if (IsInternetExplorer)
{
// Logoff Internet Explorer
document.execCommand("ClearAuthenticationCache");
window.location = LogOffPage;
}
else
{
// Logoff every other browsers
$.ajax({
username: 'unknown',
password: 'WrongPassword',
url: './cgi-bin/PrimoCgi',
type: 'GET',
beforeSend: function(xhr)
{
xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
},
error: function(err)
{
window.location = LogOffPage;
}
});
}
}
$(document).ready(function ()
{
$('#Btn1').click(function ()
{
// Call Clear Authentication
ClearAuthentication("force_logout.html");
});
});
answered May 20 '13 at 8:52
Claudio
5111
5111
add a comment |
add a comment |
up vote
2
down vote
function logout() {
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("msie") != -1) {
document.execCommand("ClearAuthenticationCache", false);
}
xhr_objectCarte = null;
if(window.XMLHttpRequest)
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
alert ("Your browser doesn't support XMLHTTPREQUEST");
xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
xhr_object.send ("");
xhr_object = null;
document.location = 'http://yourserver.com';
return false;
}
add a comment |
up vote
2
down vote
function logout() {
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("msie") != -1) {
document.execCommand("ClearAuthenticationCache", false);
}
xhr_objectCarte = null;
if(window.XMLHttpRequest)
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
alert ("Your browser doesn't support XMLHTTPREQUEST");
xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
xhr_object.send ("");
xhr_object = null;
document.location = 'http://yourserver.com';
return false;
}
add a comment |
up vote
2
down vote
up vote
2
down vote
function logout() {
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("msie") != -1) {
document.execCommand("ClearAuthenticationCache", false);
}
xhr_objectCarte = null;
if(window.XMLHttpRequest)
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
alert ("Your browser doesn't support XMLHTTPREQUEST");
xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
xhr_object.send ("");
xhr_object = null;
document.location = 'http://yourserver.com';
return false;
}
function logout() {
var userAgent = navigator.userAgent.toLowerCase();
if (userAgent.indexOf("msie") != -1) {
document.execCommand("ClearAuthenticationCache", false);
}
xhr_objectCarte = null;
if(window.XMLHttpRequest)
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject)
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
alert ("Your browser doesn't support XMLHTTPREQUEST");
xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
xhr_object.send ("");
xhr_object = null;
document.location = 'http://yourserver.com';
return false;
}
answered Feb 6 '15 at 15:37
Charlie
212
212
add a comment |
add a comment |
up vote
2
down vote
function logout(url){
var str = url.replace("http://", "http://" + new Date().getTime() + "@");
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4) location.reload();
}
xmlhttp.open("GET",str,true);
xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
xmlhttp.send();
return false;
}
add a comment |
up vote
2
down vote
function logout(url){
var str = url.replace("http://", "http://" + new Date().getTime() + "@");
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4) location.reload();
}
xmlhttp.open("GET",str,true);
xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
xmlhttp.send();
return false;
}
add a comment |
up vote
2
down vote
up vote
2
down vote
function logout(url){
var str = url.replace("http://", "http://" + new Date().getTime() + "@");
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4) location.reload();
}
xmlhttp.open("GET",str,true);
xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
xmlhttp.send();
return false;
}
function logout(url){
var str = url.replace("http://", "http://" + new Date().getTime() + "@");
var xmlhttp;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4) location.reload();
}
xmlhttp.open("GET",str,true);
xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
xmlhttp.send();
return false;
}
answered Mar 13 '15 at 16:50
Sushovan Mukherjee
354312
354312
add a comment |
add a comment |
up vote
1
down vote
add this to your application :
@app.route('/logout')
def logout():
return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
add a comment |
up vote
1
down vote
add this to your application :
@app.route('/logout')
def logout():
return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
add a comment |
up vote
1
down vote
up vote
1
down vote
add this to your application :
@app.route('/logout')
def logout():
return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
add this to your application :
@app.route('/logout')
def logout():
return ('Logout', 401, {'WWW-Authenticate': 'Basic realm="Login required"'})
answered Sep 18 '15 at 13:29
Amir Mofakhar
3,656284
3,656284
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
add a comment |
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
better to use this return : return('Logout', 401)
– Amir Mofakhar
Sep 18 '15 at 13:35
add a comment |
up vote
1
down vote
All you need is redirect user on some logout URL and return 401 Unauthorized
error on it. On error page (which must be accessible without basic auth) you need to provide a full link to your home page (including scheme and hostname). User will click this link and browser will ask for credentials again.
Example for Nginx:
location /logout {
return 401;
}
error_page 401 /errors/401.html;
location /errors {
auth_basic off;
ssi on;
ssi_types text/html;
alias /home/user/errors;
}
Error page /home/user/errors/401.html
:
<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
add a comment |
up vote
1
down vote
All you need is redirect user on some logout URL and return 401 Unauthorized
error on it. On error page (which must be accessible without basic auth) you need to provide a full link to your home page (including scheme and hostname). User will click this link and browser will ask for credentials again.
Example for Nginx:
location /logout {
return 401;
}
error_page 401 /errors/401.html;
location /errors {
auth_basic off;
ssi on;
ssi_types text/html;
alias /home/user/errors;
}
Error page /home/user/errors/401.html
:
<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
add a comment |
up vote
1
down vote
up vote
1
down vote
All you need is redirect user on some logout URL and return 401 Unauthorized
error on it. On error page (which must be accessible without basic auth) you need to provide a full link to your home page (including scheme and hostname). User will click this link and browser will ask for credentials again.
Example for Nginx:
location /logout {
return 401;
}
error_page 401 /errors/401.html;
location /errors {
auth_basic off;
ssi on;
ssi_types text/html;
alias /home/user/errors;
}
Error page /home/user/errors/401.html
:
<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
All you need is redirect user on some logout URL and return 401 Unauthorized
error on it. On error page (which must be accessible without basic auth) you need to provide a full link to your home page (including scheme and hostname). User will click this link and browser will ask for credentials again.
Example for Nginx:
location /logout {
return 401;
}
error_page 401 /errors/401.html;
location /errors {
auth_basic off;
ssi on;
ssi_types text/html;
alias /home/user/errors;
}
Error page /home/user/errors/401.html
:
<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>
answered Dec 12 '15 at 14:12
Envek
1,85211629
1,85211629
add a comment |
add a comment |
up vote
1
down vote
Based on what I read above I got a simple solution that works on any browser:
1) on you logout page you call an ajax to your login back end. Your login back end must accept logout user. Once the back end accept, the browser clear the current user and assumes the "logout" user.
$.ajax({
async: false,
url: 'http://your_login_backend',
type: 'GET',
username: 'logout'
});
setTimeout(function () {
window.location.href = 'http://normal_index';
}, 200);
2) Now when the user got back to the normal index file it will try to automatic enter in the system with the user "logout", on this second time you must block it by reply with 401 to invoke the login/password dialog.
3) There are many ways to do that, I created two login back ends, one that accepts the logout user and one that doesn't. My normal login page use the one that doesn't accept, my logout page use the one that accepts it.
add a comment |
up vote
1
down vote
Based on what I read above I got a simple solution that works on any browser:
1) on you logout page you call an ajax to your login back end. Your login back end must accept logout user. Once the back end accept, the browser clear the current user and assumes the "logout" user.
$.ajax({
async: false,
url: 'http://your_login_backend',
type: 'GET',
username: 'logout'
});
setTimeout(function () {
window.location.href = 'http://normal_index';
}, 200);
2) Now when the user got back to the normal index file it will try to automatic enter in the system with the user "logout", on this second time you must block it by reply with 401 to invoke the login/password dialog.
3) There are many ways to do that, I created two login back ends, one that accepts the logout user and one that doesn't. My normal login page use the one that doesn't accept, my logout page use the one that accepts it.
add a comment |
up vote
1
down vote
up vote
1
down vote
Based on what I read above I got a simple solution that works on any browser:
1) on you logout page you call an ajax to your login back end. Your login back end must accept logout user. Once the back end accept, the browser clear the current user and assumes the "logout" user.
$.ajax({
async: false,
url: 'http://your_login_backend',
type: 'GET',
username: 'logout'
});
setTimeout(function () {
window.location.href = 'http://normal_index';
}, 200);
2) Now when the user got back to the normal index file it will try to automatic enter in the system with the user "logout", on this second time you must block it by reply with 401 to invoke the login/password dialog.
3) There are many ways to do that, I created two login back ends, one that accepts the logout user and one that doesn't. My normal login page use the one that doesn't accept, my logout page use the one that accepts it.
Based on what I read above I got a simple solution that works on any browser:
1) on you logout page you call an ajax to your login back end. Your login back end must accept logout user. Once the back end accept, the browser clear the current user and assumes the "logout" user.
$.ajax({
async: false,
url: 'http://your_login_backend',
type: 'GET',
username: 'logout'
});
setTimeout(function () {
window.location.href = 'http://normal_index';
}, 200);
2) Now when the user got back to the normal index file it will try to automatic enter in the system with the user "logout", on this second time you must block it by reply with 401 to invoke the login/password dialog.
3) There are many ways to do that, I created two login back ends, one that accepts the logout user and one that doesn't. My normal login page use the one that doesn't accept, my logout page use the one that accepts it.
edited Mar 2 '17 at 15:54
answered Mar 2 '17 at 15:45
Foad
37136
37136
add a comment |
add a comment |
up vote
0
down vote
- use a session ID (cookie)
- invalidate the session ID on the server
- Don't accept users with invalid session IDs
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
add a comment |
up vote
0
down vote
- use a session ID (cookie)
- invalidate the session ID on the server
- Don't accept users with invalid session IDs
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
add a comment |
up vote
0
down vote
up vote
0
down vote
- use a session ID (cookie)
- invalidate the session ID on the server
- Don't accept users with invalid session IDs
- use a session ID (cookie)
- invalidate the session ID on the server
- Don't accept users with invalid session IDs
answered Oct 24 '08 at 13:24
Tomalak
255k51423539
255k51423539
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
add a comment |
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
It's also good to offer Basic Authentication as a backup login scheme for when cookies aren't available.
– bobince
Oct 24 '08 at 13:35
6
6
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
Invalidating session doesn't work, see other comments.
– Marko
Oct 24 '08 at 14:08
add a comment |
up vote
0
down vote
This JavaScript must be working for all latest version browsers:
//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;
//Clear Basic Realm Authentication
if(isIE){
//IE
document.execCommand("ClearAuthenticationCache");
window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("");
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m);
window.location = '/';
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
window.location = 'http://log:out@'+Host+'/';
}
add a comment |
up vote
0
down vote
This JavaScript must be working for all latest version browsers:
//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;
//Clear Basic Realm Authentication
if(isIE){
//IE
document.execCommand("ClearAuthenticationCache");
window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("");
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m);
window.location = '/';
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
window.location = 'http://log:out@'+Host+'/';
}
add a comment |
up vote
0
down vote
up vote
0
down vote
This JavaScript must be working for all latest version browsers:
//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;
//Clear Basic Realm Authentication
if(isIE){
//IE
document.execCommand("ClearAuthenticationCache");
window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("");
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m);
window.location = '/';
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
window.location = 'http://log:out@'+Host+'/';
}
This JavaScript must be working for all latest version browsers:
//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
// At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;
//Clear Basic Realm Authentication
if(isIE){
//IE
document.execCommand("ClearAuthenticationCache");
window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
(function(safeLocation){
var outcome, u, m = "You should be logged out now.";
// IE has a simple solution for it - API:
try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
// Other browsers need a larger solution - AJAX call with special user name - 'logout'.
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x){
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
x.send("");
// x.abort()
return 1 // this is **speculative** "We are done."
} else {
return
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
}
if (!outcome) {
m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
}
alert(m);
window.location = '/';
// return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
window.location = 'http://log:out@'+Host+'/';
}
answered Jul 21 '15 at 5:16
Amit Shah
1
1
add a comment |
add a comment |
up vote
0
down vote
I updated mthoring's solution for modern Chrome versions:
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit || bowser.chrome) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
add a comment |
up vote
0
down vote
I updated mthoring's solution for modern Chrome versions:
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit || bowser.chrome) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
add a comment |
up vote
0
down vote
up vote
0
down vote
I updated mthoring's solution for modern Chrome versions:
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit || bowser.chrome) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I updated mthoring's solution for modern Chrome versions:
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit || bowser.chrome) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
answered May 15 '17 at 23:15
Max
596613
596613
add a comment |
add a comment |
up vote
0
down vote
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
add a comment |
up vote
0
down vote
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
add a comment |
up vote
0
down vote
up vote
0
down vote
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
edited Sep 20 at 8:38
jwg
3,20512951
3,20512951
answered Jan 9 '17 at 10:29
Hasan Junaid Hashmi
372
372
add a comment |
add a comment |
protected by Community♦ Aug 3 '17 at 16:52
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
1
Just curious. Why do you want to do this?
– DOK
Oct 24 '08 at 13:41
14
To be able to log in as a different user.
– Marko
Oct 24 '08 at 14:08
13
@DOK - It's a standard social-hacking thing: users should be able to log out while leaving their browser open. Suppose one of your users accesses the site on a public machine? They need to log-off explicitly so that the next user can't access the site as them.
– Keith
Jun 9 '11 at 7:53
@DOK There is also the problem that it makes it impossible for the user to logout of the site. The server can clear the authorization cookie, and even the session cookie. But when the browser goes to load the
/
page, they will automatically be logged in again.– Ian Boyd
May 11 '16 at 19:22
I using the method that send a fake request to logout, but it locks the user in customer since there is a strick limitation that 3 times login failed in AD. So, suggest using this method(send a fake request) with caution.
– Qianchao Pan
Jul 31 '17 at 3:32