2016-06-19 23 views
0

Azureディレクトリに2つのアプリケーションを作成しました.1つはAPIサーバ用、もう1つはAPIクライアント用でした。私は、次の方法を使用して、私のAPIアプリケーションに要求を送信しようとしたが「不正」になっ保つ401ベアラトークンを使用してAzure APIアプリケーションに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' 
     ) 

私は、Python ADALライブラリを使用していますし、正常に次のコードを使用してトークンを取得することができます
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/'、ヘッダー= {"認証":id_token、 "コンテンツタイプ": "アプリケーション/ JSON "}) がに評価され、 "<応答[401]>" "response.contentあなたは、このディレクトリまたはページを表示する権限がありません" である "" "response.reasonは " 無断" です" "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 - あなたの応答に感謝します。私はPython SDKをまったく使用していません。私は単純にPythonを使用して、Authorizationヘッダーに含まれるBearerトークンを使用してエンドポイントへのREST呼び出しを行います。私はまた、同じ問題を抱えて、郵便配達員を使って同じREST呼び出しをしています。 – Progger

+0

申し訳ありません。サービスプリンシパルを使用してトークンを取得し、GETリクエストを行いました。私の側には制限があるため、ユーザーの資格情報を使用することはできません。ユーザーの資格情報を使って特定のリソースのトークンを取得するときに、ユーザーがデフォルトのAADにあるかどうかを確認する必要があります(デフォルトのAADでユーザーを作成する)(https://azure.microsoft。 com/en-us/documentation/articles/active-directory-create-users /)を参照してください。 – Derek

0

@Derek、 Azure Portalで問題のURLを設定できますか?誤った問題URLを設定すると、同じエラーが発生する可能性があります。あなたのコードが正しいようです。 enter image description here

私の経験上のベースには、Azureの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

こんにちは。お返事をありがとうございます。私は既に、あなたが1つの違いを示唆したようにすべての設定を既に行っていました。私は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にありました。 .Netとpythonアプリケーションが送信した実際のHTTPリクエストを比較すると、微妙な違いはpythonアプリケーションが明示的にapi-version=1.0を要求するPOST要求を送信したことです。

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

は、私は私のリソースにアクセスすることができ、アダルライブラリに oauth2_client.pyに次の行を変更したら。

たちはgithubのにライブラリにパッチを適用するためにプル要求に取り組んでいる

return urlparse(self._token_endpoint) 

に、方法_create_token_url

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

を変更しました。

+1

FYI:@starsheriffで説明されている回避策は、ADAL 0.4.3+で実装されています。 'AuthenticationContext'を作成するときは、' api_version = None'で渡してください。 [この会話](https://github.com/AzureAD/azure-activedirectory-library-for-python/issues/54#issuecomment-261680626)で詳細を参照してください。 – RayLuo

関連する問題