[jquery] 기본 인증을 위해 올바른 인증 헤더를 보내는 방법

API에서 데이터를 POST하려고하는데 기본 인증을 통과 할 수 없습니다.

나는 시도한다 :

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic [REDACTED]');
  }
});

내 서버 구성 응답은 다음과 같습니다.

response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "POST"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "*"

내가 얻는 헤더는 다음과 같습니다.

요청 헤더

OPTIONS /api/v1/token-auth/ HTTP/1.1
Host: theappurl.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
Access-Control-Request-Headers: origin, authorization, content-type
Accept: */*
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: es,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

응답 헤더

HTTP/1.1 401 Unauthorized
Server: nginx/1.1.19
Date: Fri, 16 Aug 2013 01:29:21 GMT
Content-Type: text/html
Content-Length: 597
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

Advanced REST Client 에서 API에 액세스 할 수 있기 때문에 서버 구성이 좋은 것 같습니다. (Chrome Extension)

어떤 제안?

PD : Advanced REST 클라이언트에서 얻은 헤더는 다음과 같습니다.

    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31
    Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
    Authorization: Basic [REDACTED]
    Content-Type: application/x-www-form-urlencoded
    Accept: */*
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: es,en;q=0.8
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

    Server: nginx/1.1.19
    Date: Fri, 16 Aug 2013 01:07:18 GMT
    Content-Type: application/json; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Vary: Accept, Cookie
    Allow: POST, OPTIONS
    X-Robots-Tag: noindex

OPTION 방법 보내기



답변

URL의 일부로 사용자 및 비밀번호를 포함 할 수 있습니다.

http://user:passwd@www.server.com/index.html

자세한 내용은이 URL을 참조하십시오.

URL 및 암호화로 전달 된 HTTP 기본 인증 자격 증명

물론 사용자 이름 암호가 필요합니다 'Basic hashstring.

도움이 되었기를 바랍니다…


답변

https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decodinghttp://en.wikipedia.org/wiki/Basic_access_authentication이 여기에 얼마나 대신 헤더와 기본 인증을 수행하는 URL에 사용자 이름과 비밀번호를 입력하는 것입니다. 이것은 여전히 ​​네트워크 나이 JS 코드에 액세스 할 수있는 사람 (예 : 브라우저에서 실행하는 사용자)에게 사용자 이름이나 비밀번호를 숨기지 않습니다.

$.ajax({
  type: 'POST',
  url: http://theappurl.com/api/v1/method/,
  data: {},
  crossDomain: true,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization', 'Basic ' + btoa(unescape(encodeURIComponent(YOUR_USERNAME + ':' + YOUR_PASSWORD))))
  }
});


답변

NodeJS 답변 :

NodeJS를 사용하여 수행하려는 경우 : Authorization헤더 가있는 JSON 엔드 포인트에 대한 GET을 만들고 Promise다시 가져 옵니다.

먼저

npm install --save request request-promise

( npm 참조 ) 다음 .js파일에서 :

var requestPromise = require('request-promise');

var user = 'user';
var password = 'password';

var base64encodedData = Buffer.from(user + ':' + password).toString('base64');

requestPromise.get({
  uri: 'https://example.org/whatever',
  headers: {
    'Authorization': 'Basic ' + base64encodedData
  },
  json: true
})
.then(function ok(jsonData) {
  console.dir(jsonData);
})
.catch(function fail(error) {
  // handle error
});


답변

브라우저 환경에 있다면 btoa 를 사용할 수도 있습니다 .

btoa문자열을 인수로 사용하고 Base64로 인코딩 된 ASCII 문자열을 생성하는 함수입니다. 97 %의 브라우저에서 지원됩니다 .

예:

> "Basic " + btoa("billy"+":"+"secretpassword")
< "Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ="

그런 다음 헤더에 추가 Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=할 수 있습니다 authorization.

HTTP BASIC 인증에 대한 일반적인 경고가 적용됩니다. 가장 중요한 것은 https를 통해 트래픽을 보내지 않으면 도청 된 사람이 Base64 인코딩 문자열을 디코딩하여 암호를 얻을 수 있다는 것입니다.

이 security.stackexchange.com 답변은 몇 가지 단점에 대한 좋은 개요를 제공합니다.


답변

URL의 일부로 사용자와 암호를 사용할 필요가 없습니다.

당신은 이것을 시도 할 수 있습니다

byte[] encodedBytes = Base64.encodeBase64("user:passwd".getBytes());

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();


답변