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


100

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 방법 보내기


19
이 게시물이 오래 전에 죽었다는 것을 알고 있지만 Authorization : 헤더를 게시함으로써 본질적으로 암호를 일반에 게시 한 것을 알지 못하는 경우를 대비하여 지적하고 싶습니다. 횡설수설 문자열은 사용자 이름 : 암호의 base64 인코딩뿐이므로 모든 사람이 암호를 볼 수 있습니다. 희망이 실현 여기 더미 암호 : 사용
Lexelby

이것은 ssrs 보고서 서버 2017에서 잘 작동합니다. URL에서 비밀번호와 사용자 이름을 숨 깁니다.
Clark Vera

@Lexelby : 사용자 이름은 "사용자"이고 암호는 스페인어로 "및 암호"입니다. 그래서 나는 이것이 실제 자격 증명이 아니라고 생각합니다.
pdr

답변:


49

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

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

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

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

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

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


6
이 솔루션은 Android의 기본 브라우저 (Pre KitKat)에서 작동하지 않습니다. 사용자 이름 / 로그인 양식은 여전히 ​​사용자에게 팝업되므로주의하십시오.
Sterling Bourne

58
이 방법은 ... 네트워크 나 장치에 사람이 듣기에 사용자 이름과 암호를 노출
아담

5
@ 아담 해시 문자열도 안전하지 않습니다
무스타파

38
이것은 질문에 전혀 대답하지 않습니다. URL로 전달하는 것은 헤더가 아닙니다.
jemiloii

5
반대 투표 이유 : developer.mozilla.org/en-US/docs/Web/HTTP/Authentication . 기사의 끝 부분에 다음과 같이 언급되어 있습니다The use of these URLs is deprecated
anurupr

70

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))))
  }
});

1
참고 :이 기능이 IE6,7,8,9에서 작동하려면 Base64.js와 같은 window.btoa 폴리 필이 필요합니다. 또한 unescape는 ECMAScript v3에 따라 더 이상 사용되지 않습니다.
null

@Techbrunch 당신은 착각합니다. seanp2k의 예제는 매우 잘 작동합니다. 이것은 매우 잘 알려진 트릭을 사용하여 유니 코드 문자를 ASCII로 디코딩합니다. 실제로 (un) escape는 유니 코드를 지원하지 않지만 (dec) encodeURIComponent는 지원한다는 사실을 사용합니다.

41

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
});

1
감사합니다, 당신은 내 하루 :) 저장
Sparw

당신이 "가져 오기"사용하는 응용 프로그램을 반응 내에서 일 감사
MohsenFM

13

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

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

예:

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

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

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

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


3

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

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

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

String USER_PASS = new String(encodedBytes);

HttpUriRequest request = RequestBuilder.get(url).addHeader("Authorization", USER_PASS).build();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.