기본 HTTP 및 Bearer 토큰 인증


115

현재 개발 환경을 위해 HTTP-Basic으로 보호되는 REST-API를 개발 중입니다. 실제 인증은 토큰을 통해 이루어지기 때문에 두 개의 인증 헤더를 보내는 방법을 알아 내려고 여전히 노력하고 있습니다.

나는 이것을 시도했다 :

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

예를 들어 내 IP에 대한 HTTP 인증을 비활성화 할 수 있지만 일반적으로 동적 IP를 사용하는 다른 환경에서 작업하기 때문에 이것은 좋은 솔루션이 아닙니다. 그래서 내가 뭔가를 놓치고 있습니까?


2
개발자 서버가 보호되고 API에 대한 토큰 기반 인증이 필요하므로 HTTP Basic을 통해 인증해야합니다. 하지만 curl을 사용하여 API를 테스트 할 때 두 인증 헤더를 모두 보내는 방법이 필요합니다. 따라서 첫 번째 (기본)는 HTTP 기본을 전달하고 두 번째 (토큰)는 ​​내 애플리케이션에 인증합니다. 그리고 네, 그것은 제 자신의 창조물입니다.
Azngeek

1
이걸 알아 냈어? 나는 현상금을 추가하고 있습니다
Adam Waite 2014 년

4
안녕 아담, 안타깝게도 아닙니다. 이제 토큰에 대한 인증 헤더를 표준 헤더가 아닌 "x-auth"로 변경하여 인증 작동 방식을 변경했습니다.
Azngeek

1
내 nginx 서버는 2 개의 Authorization 헤더도 허용하지 않습니다. 그것은을 반환합니다 400 Bad request. 바보.
Rudie 2015-06-12

1
API 토큰에 사용자 지정 헤더를 사용하는 데있어 문제점은 무엇입니까? 여기 사람들이 HTTP Basic Auth를 사용하여 개발 / 스테이징 서버를 엿보는 눈에서 멀리 떨어진 이유를 알지 못합니다.
Sunil D.

답변:


68

URL에서 기본 인증을 푸시하려면 다음을 시도하십시오.

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

위의 방법이 작동하지 않으면 그와 관련이 없습니다. 따라서 다음 대안을 시도하십시오.

다른 이름으로 토큰을 전달할 수 있습니다. 귀하는 귀하의 애플리케이션에서 승인을 처리하고 있기 때문입니다. 따라서 이러한 특수 목적을 위해 이러한 유연성을 쉽게 사용할 수 있습니다.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

헤더를 Application-Authorization. 따라서 응용 프로그램에서 해당 헤더 아래에있는 토큰을 찾아 필요한 작업을 처리합니다.

또 다른 방법 tokenPOST매개 변수 를 전달 하고 서버 측에서 매개 변수 값을 가져 오는 것입니다. 예를 들어 curl post 매개 변수를 사용하여 토큰을 전달합니다.

-d "auth-token=mytoken123"

1
안녕하세요 Sabuj, 문제는 사용자 이름과 비밀번호를 전달하는 방법이 아니라 여러 인증 헤더가 작동하지 않는 것입니다. 사양 ( ietf.org/rfc/rfc2617.txt )을 보면 이것이 가능해야한다는 것을 알 수 있습니다. 그러나 ""사용자 에이전트는 가장 강력한 인증 체계가있는 문제 중 하나를 사용하도록 선택해야합니다.이 문제를 이해하고 사용자에게 해당 문제를 기반으로 자격 증명을 요청해야합니다. "2 일 전에 작성한 것처럼 비표준 아키텍처를 다룰 때 절대적으로 괜찮은 비표준 헤더에 토큰
Azngeek

5
@Azngeek Curl은 작업을 수행 할 때 두 권한 부여 헤더를 모두 보냅니다. 서버 측에서 처리해야합니다. -vparam을 사용 하여 두 헤더로 curl 명령을 실행하십시오 . Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123요청 헤더에서 보내는 것을 찾을 수 있습니다. 서버 쪽에서 확인하면 Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123쉼표로 구분 된 이와 같은 인증 헤더가 있음을 알 수 있습니다 . 그래서 나는 당신에게 대안을 제안해야하지만.
Sabuj Hassan 2014

34

표준 ( https://tools.ietf.org/html/rfc6750 )은 다음을 사용할 수 있다고 말합니다.

  • 양식 인코딩 본문 매개 변수 : 인증 : Bearer mytoken123
  • URI 쿼리 매개 변수 : access_token = mytoken123

따라서 URI로 많은 Bearer Token을 전달할 수 있지만 이렇게하는 것은 권장되지 않습니다 (표준의 섹션 5 참조).


4

사이에 nginx와 같은 역방향 프록시를 사용하는 경우 X-API-Token.

nginx에서는 업스트림 프록시 (나머지 API)가 인증이되도록 다시 작성합니다.

proxy_set_header Authorization $http_x_api_token;

... nginx는 원래 Authorization 헤더를 사용하여 HTTP AUth를 확인할 수 있습니다.


3

비슷한 문제가 발생했습니다. 장치에서 장치와 사용자를 인증했습니다. Cookie헤더와 함께 헤더를 사용했습니다 Authorization: Bearer....


왜 반대표를 던 졌는지 명확하지 않습니다. 관련 문제에 대한 답을 찾기 위해이 질문을 발견했습니다. 이것이 제가 해결 한 방법입니다. Cookie헤더는 이미 자주 인증에 사용됩니다.
Iiridayn 2018

2

컬 --anyauth

curl에게 자체 인증 방법을 알아 내고 원격 사이트에서 지원한다고 주장하는 가장 안전한 방법을 사용하도록 지시합니다. 이는 먼저 요청을 수행하고 응답 헤더를 확인하여 수행되므로 추가 네트워크 왕복이 발생할 수 있습니다. --basic, --digest, --ntlm 및 --negotiate를 사용하여 수행 할 수있는 특정 인증 방법을 설정하는 대신 사용됩니다.


1

개발 서버에서 API를 테스트하기위한 또 다른 솔루션이 있습니다.

  • HTTP Basic Authentication웹 경로에 대해서만 설정
  • 모든 API 경로를 인증에서 제외하십시오.

에 대한 웹 서버 구성 nginxLaravel같이 될 것이다 :

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer 웹 크롤러 및 기타 원치 않는 방문자로부터 개발 서버를 방어하는 작업을 수행합니다.


0

nginx를 사용하면 다음과 같이 두 토큰을 모두 보낼 수 있습니다 (표준에 위배 되더라도).

Authorization: Basic basic-token,Bearer bearer-token

이것은 기본 토큰이 첫 번째 인 한 작동합니다. nginx는이를 애플리케이션 서버로 성공적으로 전달합니다.

그런 다음 애플리케이션이 위의 문자열에서 Bearer를 올바르게 추출 할 수 있는지 확인해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.