2009-11-17 2 views
93

현재 제가 작업하고있는 응용 프로그램에는 세션 시간 초과 값이 있습니다. 사용자가이 값보다 길게 상호 작용하지 않은 경우로드 할 다음 페이지에 로그인하라는 메시지가 표시됩니다.HTTP 401 - 적절한 WWW-Authenticate 헤더 값은 무엇입니까?

모든 요청은 AJAX 호출을 포함하여이 메커니즘을 통해 전달됩니다. 원래 200 페이지가 로그인 페이지로 보내졌습니다. 200 페이지의 응답이 보내지면 코드가 실행되고 AJAX에서 몇 가지 문제가 발생합니다.이 RPC 호출에서 보내진 대부분의 데이터는 JSON 또는 원시 JavaScript로 평가됩니다. ask : |).

나는 우리의 JSON 파서는 HTML 로그인 페이지를 소비하려고하지 때문에 401이 더 나은 것을 제안했습니다 .. :)

reading the spec은, 그러나, 내가 발견하면 WWW-Authenticate 필드해야하는 또한 보냈습니다.

이 필드에 적합한 값은 무엇입니까? Application Login으로 충분합니까?

답변

58

우리가 뭔가를 반환합니다. 이 경우 realm은 브라우저에 사용자 ID와 암호를 묻는 메시지가 표시 될 때 사용자에게 표시 될 수있는 리터럴을 제공합니다.

Basic 인증을 사용할 때 세션 만료 시점이 없기 때문에 분명히 Basic을 사용하지 않는 것입니다. 나는 당신이 폼 기반 인증의 어떤 형태를 사용하고 있다고 가정합니다.

회상에서 Windows Challenge Response는 다른 구성표와 다른 인수를 사용합니다.

트릭은 브라우저에서 지원하는 스키마와 브라우저에서 응답하는 방식을 결정하는 것이 브라우저의 몫입니다.

폼 기반 인증을 사용한다면 200 + relogin 페이지를 유지하면서 브라우저에서 무시하지만 AJAX가 식별 할 수있는 사용자 정의 헤더를 추가하는 것이 좋습니다.

정말 좋은 사용자 + AJAX 환경을 얻으려면 세션이 만료 된 AJAX 요청에 응답하고 팝업을 통해 다시 로그인 요청을 시작하고 성공하면 원래 AJAX 요청을 다시 제출하고 계속 수행하십시오 정상적으로.

세션이 만료되어 세션이 만료 되어도 세션이 만료 될 때마다 5 분마다 스크립트가 사이트를 치는 것을 피하십시오.

다른 대안은 AJAX 요청을 태워 버리는 것이지만 사용자 경험이 좋지 않습니다.

+1

감사가 리디렉션하지 않고 있기 때문에 나는 지금 대신 403을 사용하고, 짝을 그 말 그대로 원래 페이지 대신 로그인 양식을 포함합니다. 또한 W3 사양과 잘 일치합니다. 그러나 정보를 제공해 주셔서 감사합니다. –

+2

HTTP 401을 어떻게 여전히 사용할 수 있는지에 대한 답을 확인하십시오. http://stackoverflow.com/questions/928874/how-do-i-keep-firefox-from-prompting-for-username-password-with-http-basic -auth/19102200 # 19102200 – lanoxx

+0

예, WWW-Authenticate 헤더에 무엇이든 넣으십시오. 비슷한 맥락에서 또 다른 대답은 http://stackoverflow.com/a/1088127/689161입니다. 아니면 단순히 사양을 위반하고 헤더를 보내지 않아도됩니다 (최소한 몇 개의 사이트에서이 작업을 수행합니다). 401은 여전히 ​​403보다 더 적절합니다. – gengkev

6

아니요, 사용하려면 인증 방법 (일반적으로 "기본")과 인증 영역을 지정해야합니다. 요청 및 응답의 예는 http://en.wikipedia.org/wiki/Basic_access_authentication을 참조하십시오.

RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication을 읽고 싶을 수도 있습니다. Basic 반면

WWW-Authenticate: Basic realm="myRealm" 

는 계획이며, 나머지는 아주 많이 의존하는 구조에서입니다 : HTTP 기본 인증을 나타내는 경우

-3

사용자 세션 시간이 초과되면 HTTP 204 상태 코드를 다시 전송합니다. HTTP 204 상태에는 내용이 없습니다.

다음
xhr.send(null); 
if (xhr.status == 204) 
    Reload(); 
else 
    dropdown.innerHTML = xhr.responseText; 

가 새로 고침() 함수 : 클라이언트 측에 나는이 할

function Reload() { 
    var oForm = document.createElement("form"); 
    document.body.appendChild(oForm); 
    oForm.submit(); 
    } 
+2

어떻게 HTTP 204를 사용하고 있습니까? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 –