jQuery 및 Ajax와 함께 기본 인증 사용


419

브라우저를 통해 기본 인증을 만들려고하는데 실제로 갈 수는 없습니다.

이 스크립트가 없으면 브라우저 인증이 대신되지만 사용자가 인증하려고한다는 것을 브라우저에 알리고 싶습니다.

주소는 다음과 같아야합니다.

http://username:password@server.in.local/

양식이 있습니다.

<form name="cookieform" id="login" method="post">
      <input type="text" name="username" id="username" class="text"/>
      <input type="password" name="password" id="password" class="text"/>
      <input type="submit" name="sub" value="Submit" class="page"/>
</form>

그리고 스크립트 :

var username = $("input#username").val();
var password = $("input#password").val();

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = Base64.encode(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{"username": "' + username + '", "password" : "' + password + '"}',
    success: function (){
    alert('Thanks for your comment!');
    }
});

6
그렇게 하지 않는 기본 인증을 처리 할 수있는 브라우저를 원하는? 왜 폼 기반 인증을 사용하지 않습니까?
no.good.at.coding

@ no.good.at.coding 인증이 필요한 타사 API와 통합해야하는 경우 ( 개발 하려는 것-developer.zendesk.com/rest_api/docs/core/… )
Brian Hannay

답변:


467

jQuery의 beforeSend콜백을 사용 하여 인증 정보가있는 HTTP 헤더를 추가하십시오.

beforeSend: function (xhr) {
    xhr.setRequestHeader ("Authorization", "Basic " + btoa(username + ":" + password));
},

6
나는 u 예제를 사용했지만`$ .ajax ({url : " server.in.local / index.php ", beforeSend : function (xhr) {xhr.setRequestHeader ( "Authorization", "Basic) ”+ encodeBase64 (“username : password”));}, 성공 : function (val) {// alert (val); alert ( "댓글 감사합니다!");}}); `
Patrioticcow

69
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };나를 위해 일한다
Rico Suter

12
문제 ... 인증 정보가 통과하지 못하면 Chrome에서 사용자 이름 / 암호를 다시 입력하라는 대화 상자가 표시됩니다. 자격 증명이 실패한 경우이 두 번째 대화 상자가 나타나지 않도록하려면 어떻게해야합니까?
David

2
다른 사람이 볼 수 있도록 사용자 이름과 비밀번호를 열어 두지 않습니까? base64에 있어도 해독 할 수 있습니다. 아래 답변과 동일합니다.
cbron

6
@calebB 기본 인증은 일반적으로 누구나 볼 수 있도록 사용자 이름과 비밀번호를 열어 둡니다. 이것은 여기에 설명 된 방법의 문제가 아닙니다. 기본 인증 또는 실제로 모든 인증을 사용중인 경우 SSL도 사용해야합니다.
Jason Jackson

354

일 년에 상황이 어떻게 변하는가. xhr.setRequestHeader현재 jQuery (1.7.2+) 대신 헤더 속성 외에도 $.ajax호출시 사용자 이름 및 비밀번호 속성이 포함됩니다 .

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  username: username,
  password: password,
  data: '{ "comment" }',
  success: function (){
    alert('Thanks for your comment!'); 
  }
});

주석 및 기타 답변에서 편집 : 명확하게- (1.7 이전) 401 Unauthorized대신 응답 없이 사전에 인증을 보내 setRequestHeader려면 'headers':

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  headers: {
    "Authorization": "Basic " + btoa(USERNAME + ":" + PASSWORD)
  },
  data: '{ "comment" }',
  success: function (){
    alert('Thanks for your comment!'); 
  }
});

15
그렇지 username않아야 user합니까? 또한 그것은 정확히 동일하지 않습니다. 온라인 docos와 내 경험에서 일부 API가 요구하는 것처럼 선점 적이 지 않은 것처럼 보입니다. 즉 Authorization, 코드 401이 반환 될 때만 헤더를 보냅니다 .
스테파노 Fratini

3
@StefanoFratini-당신은 두 가지 모두 정확합니다. 사용자 이름 필드를 수정했으며 선점 인증에 대해 알고 도전 할 때만 응답하는 것이 좋습니다. 다른 답변에서와 같이 명시 적으로 헤더를 설정하면 기본 인증의 '수동'변형을 사용할 수 있습니다.
jmanning2k

나를 위해 위의 옵션이 작동하지
않았다

올바른 헤더 등의 코멘트 위 참조, {: "기본"+ btoa ( "는 패스 사용자") "인증"} 표시하기 위해이 답변을 수정하시기 바랍니다
제이

2
이것은 내가 찾은 대답입니다! 이 답변의 핵심은 '헤더'를 사용하여 인증을 선제 적으로 보내는 방법입니다. 내 질문은 이것에 의해 대답됩니다. stackoverflow.com/questions/28404452/…
Steven Anderson 1

63

beforeSend 콜백 을 사용하여 다음과 같은 인증 정보가있는 HTTP 헤더를 추가하십시오.

var username = $("input#username").val();
var password = $("input#password").val();  

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = btoa(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{}',
    beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', make_base_auth(username, password)); 
    },
    success: function (){
        alert('Thanks for your comment!'); 
    }
});

4
Base64 암호화에 사용 된 "btoa"는 IE 버전 10 이하 및 일부 모바일 플랫폼에서 지원되지 않습니다.
SET

1
또한이 developer.mozilla.org/en-US/docs/DOM/window.btoa 에 따르면 btoa (unescape (encodeURIComponent (str)))
SET

@SET은, 내가 그것을 btoa (에 encodeURIComponent (탈출 (STR))) 할 필요가 추측
Saurabh 쿠마

나는 응답을 얻고 싶었고 async false를 없애고 결과 매개 변수를 성공 함수에 추가했습니다. 또한 사전 생성 된 Authorization 헤더가 있으므로 대신 대신 사용했습니다.
radtek

1
@SET은 Base64가 암호화가 아니라 인코딩이라는 점에 유의해야합니다. 그것이 암호화라면, 단일 함수 호출로 그것을 해독하는 것은
Chris

40

또는 1.5에 도입 된 headers 속성을 사용하십시오.

headers: {"Authorization": "Basic xxxx"}

참조 : jQuery Ajax API


각 사용자에게 어떻게해야하는지 알려주시겠습니까? 데이터베이스에서 각 사용자에 대한 API 토큰을 가져 와서 아약스 헤더와 함께 보냅니다.
Haniye Shadman

32

위의 예제는 약간 혼란스럽고 이것이 가장 좋은 방법 일 것입니다.

$.ajaxSetup({
  headers: {
    'Authorization': "Basic " + btoa(USERNAME + ":" + PASSWORD)
  }
});

Rico와 Yossi의 답변을 조합하여 위의 내용을 취했습니다.

btoa의 기능을 Base64로는 문자열을 암호화한다.


5
URL에 관계없이 모든 AJAX 요청 과 함께 로그인 정보를 보내므로 이는 나쁜 생각 입니다. 또한 $.ajaxSetup()"다음 Ajax 요청에 대한 기본값을 설정하십시오. 사용하지 않는 것이 좋습니다. "에 대한 문서 가 있습니다.
Zero3

27

다른 사람들이 제안했듯이 Ajax 호출에서 직접 사용자 이름과 비밀번호를 설정할 수 있습니다.

$.ajax({
  username: username,
  password: password,
  // ... other parameters.
});

또는 자격 증명을 일반 텍스트로 저장하지 않으려면 headers 속성을 사용하십시오.

$.ajax({
  headers: {"Authorization": "Basic xxxx"},
  // ... other parameters.
});

어느 쪽을 보내든지 서버는 정중해야합니다. Apache의 경우 .htaccess 파일은 다음과 같아야합니다.

<LimitExcept OPTIONS>
    AuthUserFile /path/to/.htpasswd
    AuthType Basic
    AuthName "Whatever"
    Require valid-user
</LimitExcept>

Header always set Access-Control-Allow-Headers Authorization
Header always set Access-Control-Allow-Credentials true

SetEnvIf Origin "^(.*?)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

설명:

일부 도메인 간 요청의 경우 브라우저는 인증 헤더가없는 프리 플라이트 OPTIONS 요청을 보냅니다 . 인증 지시문을프리 플라이트에 올바르게 응답 LimitExcept 태그 .

그런 다음 몇 가지 헤더를 보내 브라우저에 인증이 허용되었음을 알리고 Access-Control-Allow-Origin 은 사이트 간 요청에 대한 권한을 부여합니다.

경우에 따라 * 와일드 카드가 Access-Control-Allow-Origin의 값으로 작동하지 않는 경우 : 수신자의 정확한 도메인을 반환해야합니다. 이 값을 캡처하려면 SetEnvIf를 사용하십시오.


5
브라우저가 인증 헤더없이 CORS 프리 플라이트 요청을 전송한다는 정보에 감사드립니다! 이와 같은 세부 사항은 디버깅 시간을 유발할 수 있습니다!
jbandi


11

JSONP 는 기본 인증에서 작동하지 않으므로 jQuery beforeSend 콜백은 JSONP / Script에서 작동하지 않습니다.

요청에 사용자와 비밀번호를 추가하여이 제한을 해결했습니다 (예 : user : pw@domain.tld). 이것은 Internet Explorer를 제외한 거의 모든 브라우저에서 작동합니다.URL을 통한 인증이 지원되지 않는 (호출이 단순히 실행되지 않음).

http://support.microsoft.com/kb/834489를 참조 하십시오 .


보안 측면에서는 이것을 허용하지 않는
건전한

링크가 끊어졌습니다 (404).
Peter Mortensen

10

아래와 같이 3 가지 방법으로이를 달성 할 수 있습니다.

방법 1 :

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
    headers: {
        "Authorization": "Basic " + btoa(uName+":"+passwrd);
    },
    success : function(data) {
      //Success block  
    },
   error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

방법 2 :

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
     beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', "Basic " + btoa(uName+":"+passwrd)); 
    },
    success : function(data) {
      //Success block 
   },
   error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

방법 3 :

var uName="abc";
var passwrd="pqr";

$.ajax({
    type: '{GET/POST}',
    url: '{urlpath}',
    username:uName,
    password:passwrd, 
    success : function(data) {
    //Success block  
   },
    error: function (xhr,ajaxOptions,throwError){
    //Error block 
  },
});

8

SharkAlley의 답변에 따르면 nginx에서도 작동합니다.

nginx 뒤에있는 서버에서 jQuery로 데이터를 가져오고 Base Auth로 제한하는 솔루션을 찾고있었습니다. 이것은 나를 위해 작동합니다 :

server {
    server_name example.com;

    location / {
        if ($request_method = OPTIONS ) {
            add_header Access-Control-Allow-Origin "*";
            add_header Access-Control-Allow-Methods "GET, OPTIONS";
            add_header Access-Control-Allow-Headers "Authorization";

            # Not necessary
            #            add_header Access-Control-Allow-Credentials "true";
            #            add_header Content-Length 0;
            #            add_header Content-Type text/plain;

            return 200;
        }

        auth_basic "Restricted";
        auth_basic_user_file /var/.htpasswd;

        proxy_pass http://127.0.0.1:8100;
    }
}

그리고 JavaScript 코드는 다음과 같습니다.

var auth = btoa('username:password');
$.ajax({
    type: 'GET',
    url: 'http://example.com',
    headers: {
        "Authorization": "Basic " + auth
    },
    success : function(data) {
    },
});

내가 찾은 기사 :

  1. 이 주제의 답변
  2. http://enable-cors.org/server_nginx.html
  3. http://blog.rogeriopvl.com/archives/nginx-and-the-http-options-method/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.