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_decoding 및 http://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();