Nice programing

http 기본 인증 "로그 아웃"

nicepro 2020. 12. 5. 10:38
반응형

http 기본 인증 "로그 아웃"


HTTP 기본 인증 자격 증명은 브라우저가 닫힐 때까지 저장되지만 브라우저를 닫기 전에 자격 증명을 제거 할 수있는 방법이 있습니까?

HTTP 401 상태 코드트릭 에 대해 읽었 지만 제대로 작동하지 않는 것 같습니다 (답변에 대한 주석 참조). 아마도 trac이 사용 하는 메커니즘이 해결책 일 것 입니다.

JavaScript로 자격 증명을 삭제할 수 있습니까? 아니면 JavaScript와 상태 401 트릭의 조합으로?


업데이트 :이 솔루션은 많은 브라우저에서 더 이상 작동하지 않는 것 같습니다. Kaitsu의 의견 :

브라우저가 올바른 인증 된 자격 증명을 잊어 버리도록 거짓 자격 증명을 보내는이 솔루션은 Chrome (16) 및 IE (9)에서 작동하지 않습니다. Firefox (9)에서 작동합니다.


실제로 서비스에 잘못된 자격 증명을 전송하여 해결 방법을 구현할 수 있습니다. 이것은 브라우저에서 비밀번호없이 다른 (존재하지 않는?) 사용자 이름을 전송하여 작동합니다. 브라우저는 인증 된 자격 증명에 대한 정보를 잃습니다.

예:

https://www.example.com/ => "user1"로 기본 인증으로 로그인

지금 열다

https : //foobar@www.example.com/

로그 아웃되었습니다. ;)

문안 인사

추신 : 그러나 주어진 정보에 의존하기 전에 필요한 모든 브라우저에서 이것을 테스트하십시오.


Jan.의 답변을 확장하고 owyongsk의 답변을 업데이트합니다.

다음은 브라우저가 보호하려는 페이지에 기본적으로 가짜 로그인 요청을 보내도록하는 jquery 자바 스크립트 코드의 예입니다. 모든 테스트 된 브라우저에서 캐시 된 자격 증명이 제거 된 다음 사용자를 보호되지 않은 페이지로 리디렉션합니다. 페이지.

무언가 잘못되었을 때 alert ()는 아마도 다른 것으로 변경되어야합니다.

//Submits an invalid authentication header, causing the user to be 'logged out'
function logout() {
    $.ajax({
        type: "GET",
        url: "PUT_YOUR_PROTECTED_URL_HERE",
        dataType: 'json',
        async: true,
        username: "some_username_that_doesn't_exist",
        password: "any_stupid_password",
        data: '{ "comment" }'
    })
//In our case, we WANT to get access denied, so a success would be a failure.
.done(function(){
    alert('Error!')
})
//Likewise, a failure *usually* means we succeeded.
//set window.location to redirect the user to wherever you want them to go
.fail(function(){
    window.location = "/";
    });
}

그런 다음 로그 아웃 링크가 logout () 함수를 호출하는 것만 큼 쉬웠으며 기술적으로는 여전히 해킹 작업이지만 사용자에게 원활하게 작동하는 것처럼 보였습니다.


최신 Chrome 및 Firefox로 현재 작동중인 해킹을 시도 할 수 있습니다. 사용자 이름 : 거짓, 암호 : 거짓과 같은 특정 자격 증명 만 허용하는 "/ logout"페이지를 서버에 만듭니다. 그런 다음 아래의 AJAX 요청을 사용하여 사용자를 해당 페이지로 보낼 수 있습니다.

  $("#logout").click(function(e){                                              
    e.preventDefault();                                                        
    var request = new XMLHttpRequest();                                        
    request.open("get", "/logout", false, "false", "false");                                                                                                                               
    request.send();                                                            
    window.location.replace("WHEREVER YOU WANT YOUR LOGGED OUT USER TO GO");                                              
  });

현재 사용자의 자격 증명 대신 유효한 XMLHttpRequest에서 잘못된 사용자 이름과 암호가 캐시되고 사용자가 페이지에 로그인하려고하면 캐시 된 가짜 자격 증명을 사용하여 인증에 실패하면 사용자에게 묻습니다. 다른 것을 입력하십시오. 도움이 되었기를 바랍니다!


just finishing an implementation that worked fine to me: At the server I evaluate Session, User Name and password, so I keep track of that information, the login algoritm is as follows:

1.Check if user and password is not empty, else return 401.

2.Check if we have registered the session in our logged-in user list, if not then check if user and password is valid and if so save session id in our list, then return 401. I'll explain this step: if the session id is different one of three things happened: a) The user is opening another window. b) The user session has finished, ie user logged out. c) The session expired due to inactivity. But we want to save the session as long as the user credentials are valid but return a 401 to ask once for password, if we don't save the session then the user could never log in because we don't have the new session id in our list.

3.Check if user credentials are right, if so, save session info and continue serving pages, else return 401.

So, the only thing I have to logout a user is to close the session at the server when the user requests the logout page and the web browser shows again the login dialog.

I'm thinking as I write this that there has to be a step where the program checks if the user is already logged to avoid impersonation, maybe I can save more than one session id per user to allow multiple session, well, I would like your comments about it.

Hope you get the idea, and comment if you see any security flaw ;)


You can delete credentials with JavaScript:

    $("#logout").click(function(){
        try {
            document.execCommand("ClearAuthenticationCache");
            window.location.href('/logout.html'); // page with logout message somewhere in not protected directory
        } catch (exception) {}
    });

This code works only in IE. This is the reason why try/catch block is added there. Also, for the same reason the logout link you should show for IE users only:

    <!--[if IE]>
        <div id="logout">[Logout]</div>
    <![endif]-->

And for other users my suggestion is something like:

    <div id="logout2" onclick="alert('Please close your browser window to logout')">[Logout]</div>

If you have control over the server code, you can create a "logout" function that replies "401 Unauthorized" regardless of the credentials given. This failure forces browsers to remove saved credentials.

I just tested this with Chrome 34, IE 11, Firefox 25 - using Express.js server and HTTP basic authentication.


What has worked for me in Chrome (Version 66) is to send an Ajax request to an URL that returns 401. That way the basic authentication cache seems to be cleared.

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "/url_that_returns_401", true);
xhttp.send();

참고URL : https://stackoverflow.com/questions/4163122/http-basic-authentication-log-out

반응형