2012-07-18 3 views
6

this tutorial을 기반으로 AJAX 쿼리를 인증하려고합니다. Crypto 라이브러리를 사용하여 적절한 권한 정보와 함께 보내기 전에 요청 헤더를 설정합니다. 내가 가지고있는 문제는 요청시 헤더가 설정되지 않는 것입니다.jQuery AJAX 헤더 인증

beforeSend : function(xhr) { 
    var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
    var base64 = Crypto.util.bytesToBase64(bytes); 
    xhr.setRequestHeader("Authorization", "Basic " + base64); 
}, 
+0

헤더가 설정되지 않은 이유는 무엇입니까? 실제 xhr 전화를 검사 했습니까? 'Crypto','username' 또는'password'가'undefined '로 설정 될 수 있습니까? curl을 사용하고 헤더 (-H)를 설정하여 if가 서버 측 문제가 아닌지 확인할 수도 있습니다. BTW, 나는 그 블로그 포스트를 쓰는 사람이다 ;-) – pdeschen

+0

나는 로그에 xhr 호출을 쓰고 있는데, 나는 그 객체 내에서 무엇을 찾고 있는가? 내가 확인한 모든 3 올바르게 정의됩니다. 현재 무슨 일이 일어나고 있는지는 명백한 이유 때문에 401 인증되지 않은 오류가 발생합니다. 좋은 소식입니다. 좋은 소식입니다. –

+0

을 Chrome과 함께 사용하면 개발자 도구를 열고 네트워크 탭을 선택한 다음 하단의 목록에서 XHR 요소를 선택하면 실제 Ajax 요청, 콘텐츠, 헤더 및 전체를 검사 할 수 있습니다. – pdeschen

답변

8

이 문제가 dataTypeJSONP에 설정되지 않은 : 여기에 내 코드입니다. 이것이 이루어지지 않았기 때문에 브라우저는 호출을 표준 AJAX 요청으로 해석했기 때문에 동일한 출처 정책에 따라 차단되었습니다. 참조

작동 코드 (신용 Crpyto을 제안하기위한 @pdeschen에 간다) :

<script type='text/javascript'> 
// define vars 
var username = ''; 
var password = ''; 
var url = ''; 

// ajax call 
$.ajax({ 
    url: url, 
    dataType : 'jsonp', 
    beforeSend : function(xhr) { 
     // generate base 64 string from username + password 
     var bytes = Crypto.charenc.Binary.stringToBytes(username + ":" + password); 
     var base64 = Crypto.util.bytesToBase64(bytes); 
     // set header 
     xhr.setRequestHeader("Authorization", "Basic " + base64); 
    }, 
    error : function() { 
     // error handler 
    }, 
    success: function(data) { 
     // success handler 
    } 
}); 
</script> 
+1

'btoa (username + ":"+ password) "로 base64에 사용자 이름과 암호를 인코딩 할 수도 있습니다. –

+0

@DanielHigueras Nice! 이 함수에 대해 몰랐는데, [IE 10+에서만 사용 가능해 보입니다.]하지만 헤이 .. 스크류 IE –

0

마지막으로 나를 위해 작동하는 것 같다. 개별 통화 기준으로 충돌이 발생할 수 있습니다. 이 메서드를 향후 연결 옵션의 기본값으로 설정합니다.

//Function(jqXHR jqXHR) 
$.ajaxSetup({beforeSend: function(jqXHR) { 
    jqXHR.setRequestHeader("My-Header", "My-Value"); 
} }); 
+2

'ajaxSetup'이 더 이상 존재하지 않으므로'ajaxSend'를 사용했습니다 : \t'$ 문서) .ajaxSend (함수 (e, xhr, 설정) { \t \t xhr.setRequestHeader ("Authorization", "mytoken"); \t});'. http://api.jquery.com/ajaxSend/를 참조하십시오. – falsarella