2016-06-19 1 views
0

내 Azure 디렉토리에 2 개의 애플리케이션을 만들었습니다. API 서버 1 개와 API 클라이언트 1 개를 만들었습니다. 나는 파이썬 ADAL 라이브러리를 사용하고 성공적으로 다음 코드를 사용하여 토큰을 얻을 수 있습니다401 Bearer 토큰을 사용하여 Azure API App에 REST 호출을 무단으로 만들기

tenant_id = "abc123-abc123-abc123" 
context = adal.AuthenticationContext('https://login.microsoftonline.com/' + tenant_id) 
token = context.acquire_token_with_username_password(
     'https://myapiserver.azurewebsites.net/', 
     'myuser', 
     'mypassword', 
     'my_apiclient_client_id' 
     ) 

내가 다음 방법을 사용하여 내 API 응용 프로그램에 요청을 보낼 수 있지만, '무단'지고 유지하려고 :

at = token['accessToken'] 
id_token = "Bearer {0}".format(at) 
response = requests.get('https://myapiserver.azurewebsites.net/', headers={"Authorization": id_token}) 

loginurl에서 myuser/mypass를 사용하여 성공적으로 로그인 할 수 있습니다. Azure AD에서 클라이언트 응용 프로그램에 서버 응용 프로그램에 대한 액세스 권한을 부여했습니다.

+0

전체 오류는 무엇입니까? – yonisha

+0

안녕하세요 @yonisha, "응답", : 응답 = requests.get ('https://myapiserver.azurewebsites.net/', headers = { "인증": id_token, "Content-Type": "응용 프로그램/JSON "<응답 [401]> 당신은이 디렉터리 또는 페이지를 볼 수있는 권한이 없습니다 response.reason가 무단" "" "response.content"입니다 ""입니다 ""}) 이하는 평가 " "response.status_code"is "401" – Progger

+0

액세스 토큰이 유효 (잘못된 액세스 토큰 오류 메시지가 다릅니다)하지만 잘못된 페이지에 액세스하려고 시도하는 것 같습니다. – yonisha

답변

0

현재 Azure Python SDK의 경우, 서비스 주체에 대한 인증을 지원합니다. 아직 ADAL 라이브러리를 사용한 인증을 지원하지 않습니다. 어쩌면 그것은 향후 릴리스에서 나올 것입니다.

자세한 내용은 https://azure-sdk-for-python.readthedocs.io/en/latest/resourcemanagement.html#authentication을 참조하십시오.

ADAL을 사용할 수있는 플랫폼에 대해서는 Azure Active Directory Authentication Libraries도 참조하십시오.

+0

안녕하세요 Derek - 답변 해 주셔서 감사합니다. 나는 파이썬 SDK를 전혀 사용하지 않고있다. 파이썬을 사용하여 Authorization 헤더에 포함 된 Bearer 토큰을 사용하여 끝점에 대한 REST 호출을 작성하기 만하면됩니다. 나는 또한 우편 배달부를 사용하고 동일한 문제가있는 동일한 REST 통화를하고있다. – Progger

+0

죄송합니다. Service Principal을 사용하여 토큰을 얻은 다음 GET 요청을 작성했습니다. 저의 한계로 인해 사용자 자격 증명을 사용할 수 없습니다. 사용자 자격 증명을 통해 주어진 리소스에 대한 토큰을 얻을 때 사용자가 기본 AAD에 있는지 여부를 확인해야합니다. 그렇지 않으면 [기본 AAD에서 사용자 만들기] (https://azure.microsoft. com/ko-kor/documentation/articles/active-directory-create-users /)를 참조하십시오. – Derek

0

@Derek, Azure Portal에서 이슈 URL을 설정할 수 있습니까? 잘못된 이슈 URL을 설정하면 같은 오류가 발생할 수 있습니다. 그것은 당신의 코드가 맞는 것 같습니다. 내 경험에 enter image description here

자료, 당신은 (. 난 당신이 이런 짓을했는지 확신합니다). 푸른 AD에 응용 프로그램을 추가하고 클라이언트 ID를 얻을 필요가 그리고 당신은에 문제의 URL 텍스트 상자에 세입자 ID 입력을받을 수 있습니다 Azure 포털.

참고 :

오래된 포털에

(manage.windowsazure.com), 하단 명령 모음에보기 끝점을 클릭 한 다음 연맹 메타 데이터 문서 URL을 복사하여 해당 문서를 다운로드하거나에로 이동 브라우저. 루트 EntityDescriptor 요소 내에는 https://sts.windows.net/ 형식의 entityID 특성이 있어야하며이어서 사용자의 특정 GUID ("테넌트 ID"라고 함)가 있어야합니다. 이 값을 복사합니다.이 값은 발급자 URL로 사용됩니다. 나중에 사용하도록 응용 프로그램을 구성합니다.

내 데모는 다음과 같습니다 :

import adal 
import requests 

TenantURL='https://login.microsoftonline.com/*******' 
context = adal.AuthenticationContext(TenantURL) 
RESOURCE = 'http://wi****.azurewebsites.net' 
ClientID='****' 
ClientSect='7****' 
token_response = context.acquire_token_with_client_credentials(
    RESOURCE, 
    ClientID, 
    ClientSect 
) 
access_token = token_response.get('accessToken') 
print(access_token) 
id_token = "Bearer {0}".format(access_token) 
response = requests.get(RESOURCE, headers={"Authorization": id_token}) 
print(response) 

을 수정 해보세요. 모든 업데이트를 알려주세요.

+0

안녕하세요. 귀하의 회신에 감사드립니다. 이미 하나의 차이점을 제안한 방식대로 모든 설정을 완료했습니다. client_id 및 client_secret을 사용하고 있지 않습니다. "acquire_token_with_client_credentials"대신 "acquire_token_with_username_password"를 사용하고 있습니다. 클라이언트에서 사용자 이름과 비밀번호를 사용하여 인증해야합니다. 이것을 시도해보고 효과가 있는지 확인할 수 있습니까? – Progger

+0

@Progger, Fiddler를 사용하여 access_token과 함께 REST API를 보내시겠습니까? –

+0

저는 Postman을 이미 사용 했었지만 다음에 시도 할 것은 username/password 대신 클라이언트 자격 증명을 사용하여 작동하는지 확인하는 것입니다. – Progger

1

질문이 오래 전에 게시되었지만 답변을 제공하려고합니다. 나는 우리가 여기서 똑같은 문제를 겪었 기 때문에 문제를 우연히 발견했다. adal 라이브러리로 토큰을 성공적으로 얻을 수 있었지만 토큰을 얻은 리소스에 액세스 할 수 없었습니다.

상황을 악화시키기 위해 .Net에 간단한 콘솔 앱을 설치하고 똑같은 매개 변수를 사용하며 작동했습니다. .NET 어플리케이션을 통해 얻은 토큰을 복사하여 Python 요청에 사용하면 효과적입니다 (이 중 하나는 분명하지만 문제가 요청을 처리하는 방법과 관련이 없음을 확신 시켰습니다).

문제의 소스은 adal python 패키지의 oauth2_client 끝에있었습니다. 닷넷과 파이썬 앱이 보낸 실제 HTTP 요청을 비교했을 때, 파이썬 앱이 명시 적으로 api-version=1.0을 요청하는 POST 요청을 보냈다는 점에서 미묘한 차이가있었습니다.

POST https://login.microsoftonline.com/common//oauth2/token?api-version=1.0 

나는 내 리소스에 액세스 할 수는 ADAL 라이브러리에 oauth2_client.py에 다음 줄을 변경하면.

우리는 GitHub의에서 라이브러리를 패치 끌어 오기 요청에 노력하고 있습니다

return urlparse(self._token_endpoint) 

에, 방법 _create_token_url

return urlparse('{}?{}'.format(self._token_endpoint, urlencode(parameters))) 

변경.

+1

참고 : @starsheriff에서 설명한 해결 방법은 ADAL 0.4.3 이상에서 구현됩니다. 당신이'AuthenticationContext'를 만들 때,'api_version = None'에서 패스하도록하십시오. [이 대화] (https://github.com/AzureAD/azure-activedirectory-library-for-python/issues/54#issuecomment-261680626)에서 자세한 내용을 참조하십시오. – RayLuo

관련 문제