2017-03-07 5 views
3

私は、自動的に転送するために一部のユーザーの電子メールにアクセスするデーモンを持っています。 Azureにデーモンを登録し、管理者が付与したいくつかのアプリケーション権限を要求しました。 これで、oAuth2トークンを取得できました。アプリケーションは期待どおりに動作します。Microsoft Graphを使用するデーモンから委任された権限を使用する

私のIT部門は、すべてのメールボックスに完全な権限を与える代わりに、そのユーザーの電子メールのみがデーモンによって読み取られて転送されるように、単一のユーザーを偽装できるかどうか尋ねています。

私はAzureに別のアプリケーションを登録しました。委任された権限のみを要求しました(管理者が承認する必要のないすべての委任された権限を選択しました。 私は認証URLを作成し、それを問題のユーザーに送信しました。ユーザーがリンクをクリックし、アプリケーションが要求したすべての権限のリストが提示され、その権限をアプリに付与することに同意した。

私のアプリは、期待どおりに認証コードを受け取りました。 MS documentationは、そのコードを使用してユーザーのメールボックスにアクセスするためのトークンを取得できることを示しています。

"grant_type=authorization_code" + 
"&client_id={appID}+ 
"&client_secret={appSecret} + 
"&code={auth_code}+ 
"&redirect_uri={Same_Redirect_URI_used_when_obtaining_Authorization_Code} + 
"&resource=https://graph.microsoft.com"  

とドキュメントに指定されている私は、承認のURLにこの内容でPOSTリクエストを発行します:だから私は、MSが提供する手順を使用してRESTパラメータを建て

https://login.microsoftonline.com/{myTenantID}/oauth2/token 

今奇妙私のスクリプトがxhr.send(tmpSnd);メソッド(のtmpSndに上記のRESTパラメータを含む)を実行するとすぐに、私はすぐにmsxml3.dll: Access is denied errorを取得します。私は少なくとも、POSTからの応答の一部としてエラーが戻ってくることを期待していましたが、私はsend()メソッドを通過することはありません。

ここで私はトークンを取得するために使用JSコードです:

this.getDelegatedToken = function(appEndPoint, appID, appSecret,auth_Code,appURI){ 
    var result=null; 
    var GRAPH_URL_TOKEN = "https://login.microsoftonline.com/" + appEndPoint + "/oauth2/token"; 
    xhr.open("POST", GRAPH_URL_TOKEN, false); 
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 

    var params ="grant_type=authorization_code" + 
     "&client_id="  + appID + 
     "&client_secret=" + appSecret + 
     "&code="   + auth_Code+ 
     "&redirect_uri=" +appURI + 
     "&resource=https://graph.microsoft.com"; 

    xhr.send(params); 
    if(xhr.status==200) { 
     result = JSON.parse(xhr.responseText); 
    } 
    return result; 
    }; 

私は唯一の委任アクセス権を使用すると、デーモンで問題を引き起こす可能性があることをどこかで読んだと思うが、私の人生のために、私は思い出すことができませんどこで私はそれを読む(グラフを使用するには多くの読書が必要です)。

EDIT

私は無効な値に&コードパラメータを設定した場合、私が予想されるエラーメッセージ(「コードが不正または無効である」)を受け取ります。有効期限が切れている以前の認証コードに設定すると、予期したエラーメッセージ("提供された認証コードまたはリフレッシュコードが期限切れです")も表示されます。だから私は意図的に無効なものを渡すときに私は適切なエラーメッセージを受け取るので、私のすべてのPOSTパラメータが有効であるように見えるだろう。私はちょうど理由を理解していない、私はすべての正しいパラメータを渡すとき、私は戻ってもエラー応答を取得しない、私はを取得アクセスはXHRオブジェクトからメッセージが拒否されました。

誰でもコードやプロセスで目に見える間違いを発見できますか?

+0

フロントエンドJavaScriptから実行していますか? – juunas

+0

私はこれをWindows Scripting Hostのインアプリインスタンスから実行しています。ウェブブラウザは関係ありません。アプリケーション自体はWindowsサービスとして実行されます。つまり、GUIは関係しません。ある意味では、NodeJSが行うことに似ています。 NodeJSを除いて、WSHをインスタンス化するWindows実行可能ファイル(Delphiで書かれています)です。 あなたの質問にお答えします。 – Filipus

+0

あなたのtenantID(appEndPointという変数)が "contoso.com"(組織の場合)のように見えるようにしたいだけです。 – piisexactly3

答えて

0

承認コードを取得したら、トークンエンドポイントにPOSTする必要があります。/tokenにPOSTリクエストを送信することにより、あなたは、 に必要なリソースをアクセストークンのコードを引き換えることができます今、あなたは認証コードを取得してきましたし、ユーザによる 権限を付与されていることをhere

を参照してください。 エンドポイント:

//ラインは、それはあなたのようには思えない読みやすさだけで

POST /{tenant}/oauth2/token HTTP/1.1 
Host: https://login.microsoftonline.com 
Content-Type: application/x-www-form-urlencoded 
grant_type=authorization_code 
&client_id=2d4d11a2-f814-46a7-890a-274a72a7309e 
&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrqqf_ZT_p5uEAEJJ_nZ3UmphWygRNy2C3jJ239gV_DBnZ2syeg95Ki-374WHUP-i3yIhv5i-7KU2CEoPXwURQp6IVYMw-DjAOzn7C3JCu5wpngXmbZKtJdWmiBzHpcO2aICJPu1KvJrDLDP20chJBXzVYJtkfjviLNNW7l7Y3ydcHDsBRKZc3GuMQanmcghXPyoDg41g8XbwPudVh7uCmUponBQpIhbuffFP_tbV8SNzsPoFz9CLpBCZagJVXeqWoYMPe2dSsPiLO9Alf_YIe5zpi-zY4C3aLw5g9at35eZTfNd0gBRpR5ojkMIcZZ6IgAA 
&redirect_uri=https%3A%2F%2Flocalhost%2Fmyapp%2F 
&resource=https%3A%2F%2Fservice.contoso.com%2F 
&[email protected] 

//NOTE: client_secret only required for web apps 

のために壊します上記のコードでこれを正しく実行しています。これが役に立ったら教えてください!

+0

申し訳ありませんが、コードをコピーして貼り付けるときに間違いを犯しました...元の投稿で修正しました。ご覧のとおり、私はMSのドキュメントで指定されているものとまったく同じ値を使用していますが、xhr.send()メソッドを呼び出すと同じ "アクセスが拒否されました"というエラーが表示されます(ちなみにxhrはインスタンス\t Microsoft.XMLHTTP) – Filipus

0

私は、クライアントシークレットを使用すると、アプリケーションのみのトークンを取得すると仮定しています。このトークンは、リソースへのアクセス権がありません。 App Onlyトークンを使用してリソースにアクセスするには、Azure Portalでアプリケーション権限(委任されているのではなく)が必要です。アプリケーションを追加してアクセス許可チェックを行い、まだアクセス拒否エラーが発生していないかどうかを確認してください。

+0

私の最初の記事で説明したように、アプリケーションパーミッションを使用していますが、私のIT部門は委任パーミッションを使用したいと思っています。 – Filipus

+0

ユーザアカウント(デリゲート)でデーモンを実行する必要があります。これは矛盾しません。サービスはユーザごとに実行されません。デリゲートからウェブフック(デリゲートを使用できる場所)ユーザーを関与せずにユーザーのコンテキストを取得する方法を考えることはできません。 –

+0

デーモンは、ユーザが許可を得たアカウントに_only_アクセスできる必要があります。デーモンがアプリケーション権限を使用する場合、私のIT部門が好まないすべてのアカウントにアクセスできます。デーモンには監視するアカウントのリストがあり、これらのアカウントごとにメッセージを取得して転送できる必要があります。 – Filipus

関連する問題