programing

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

muds 2023. 3. 17. 22:03
반응형

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

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(Chrome Extension)에서 API에 액세스할 수 있기 때문에 서버 구성이 양호한 것 같습니다.

좋은 의견이라도 있나?

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 방식

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 답변:

Node를 사용하여 작업하고 싶은 경우JS: GET to JSON 엔드포인트 만들기Authorizationheader와 get a.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
});

URL 의 일부로서 유저와 패스워드를 포함할 수 있습니다.

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

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

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

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

이게 도움이 되길...

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

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

예:

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

그런 다음 추가 가능Basic YmlsbHk6c2VjcmV0cGFzc3dvcmQ=에게authorizationheader를 클릭합니다.

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

PHP -:

$username = 'myusername';
$password = 'mypassword';
...
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
...

PHP - WordPress의 POST:

$username = 'myusername';
$password = 'mypassword';
...
wp_remote_post('https://...some...api...endpoint...', array(
  'headers' => array(
    'Authorization' => 'Basic ' . base64_encode("$username:$password")
  )
));
...

언급URL : https://stackoverflow.com/questions/18264601/how-to-send-a-correct-authorization-header-for-basic-authentication

반응형