2009-10-26 4 views
6

내 사용자는 타사 서비스의 사용자 이름과 암호를 입력합니다. 그 서비스를 인증하기 위해 아약스 호출을합니다. 문제는 그들이 잘못된 사용자 이름과 암호를 입력하면 브라우저 (적어도 firefox)는 "인증 필요"대화 상자를 표시한다는 것입니다. 그런 다음 해당 대화 상자에 정확한 사용자 이름과 암호를 입력하면 내 Ajax 호출은 "성공"을 반환하고 입력 한 원래 사용자/패스가 올바르지 않은 것으로 나타납니다 (변경 한 이후).인증이 필요한 ajax 호출을 수행 할 때 브라우저의 "인증 필요"대화 상자를 표시하지 않으려면 어떻게해야합니까?

이 대화 상자를 표시하지 않도록 설정할 수있는 방법이 있습니까 (내 서비스에서 사용자/패스를 수정하도록 지시 할 수 있습니까?) 또는 브라우저 대화 상자에 사용자가 입력 한 올바른 사용자 이름과 암호를 가져 오는 방법이 있습니까? 이것은 파이어 폭스 확장입니다. 그래서 올바른 패스/요청에서 로그인 잡을 수있는 몇 가지 방법입니다 확신합니다.하지만 자바 스크립트를 통해 간단한 방법이 있다면 좋을 것입니다. 대신 "http://blah.com을"되는 URL 문자열의

jQuery.ajax({ 
    type: "GET", 
    dataType: "xml", 
    url: endpoint, 
    username: username, 
    password: password, 
    success: function(data,status) { 
    // Do something 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown){ 
    alert(errorThrown); 
    } 
}); 

답변

1

브라우저와 인증 (필자의 경우 자바 서블릿)이 필요한 서비스 사이에 프록시를 배치하여이 문제를 해결했습니다. 브라우저는 AJAX 요청을 서블릿에 보내고 서블릿은 요청을 서비스에 전달한 다음 "WWW-Authenticate"헤더를 생략하고 서비스의 응답을 되돌려 보냅니다. 브라우저 앱. 그에 따라 HTTP 200 또는 401 응답 코드를 처리합니다.

마찬가지로 프록시는 전달 된 요청의 결과를 나타내는 json 응답을 사용하여 항상 200을 반환 할 수 있습니다. 이렇게하면 프록시의 실패와 서비스의 응답의 차이를 구분할 수 있습니다.

당신이 처리해야 할 까다로운 일 중 하나 - 상대방 서비스가 클라이언트의 세션을 만들었 기 때문에 말단의 쿠키 헤더로 응답하는 경우, 적어도 두 가지 경로가 가능합니다. .

  1. 프록시는 브라우저의 쿠키 인 쿠키를 기억합니다. 항상이 서비스에 대한 프록시를 거치며 프록시는이 쿠키를 후속 전달 된 요청에 추가합니다. 또는
  2. 서비스의 쿠키를 무시하고 프록시를 통해 사용자 이름과 비밀번호를 확인한 후 브라우저에서 서비스에 직접 다시 인증하게하십시오. 이 서비스와 분리 된 세션을 만드는 부작용이있을 수 있지만 JQuery와없이
1

, 그것은 "http://user:[email protected]는"

// Note that you might need to trim http:// out of endpoint first 
url: 'http://' + username + ':' + password + '@' + endpoint, 
+0

실제로 문제가 해결 되었습니까? URL에 지정된 사용자 이름과 암호가 올바르지 않으면 원격 서버는 여전히 401 응답을 발행 할 것으로 예상됩니다. –

-1

당신은 IE 나 파이어 폭스에서 그것을 할 수 있도록, 당신은 자바 스크립트에서 할 수 없습니다 결코 보안상의 이유로 사용자가 http 인증에 대한 프롬프트를 표시하지 않도록하는 브라우저 설정은 없습니다. 이것은 http 인증을 요구하는 이미지가 모두 50 개일 때 실제로 성가시다.

+0

사실이 아닙니다 : https : //developer.mozilla.org/ko/XmlHttpRequest # open % 28 % 29 – Marius

0

(IE에서 작동하지만 파이어 폭스 확장에 대한 확인을하지 않음) :

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com", true, "username", "password"); 
xhr.onreadystatechange = function(){ 
    if(this.readyState == 4){ 
    if(this.status == 200){ 
     alert("we got a response"); 
    } 
    } 
} 
xhr.send(); 
0

을하는 방법에 대한 HTTP 인증을 사용하지 않습니까? 쿠키와 함께 표준 로그인을 사용하거나 사용자가 스크립트에 제공 한 사용자 이름/비밀번호를 POST하고 사용자의 데이터베이스에 대해 세부 정보를 확인하십시오.

+0

그는 제 3 자 제품의 원인이라고 말했습니다. – jantimon

관련 문제