私は、自動的に転送するために一部のユーザーの電子メールにアクセスするデーモンを持っています。 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オブジェクトからメッセージが拒否されました。
誰でもコードやプロセスで目に見える間違いを発見できますか?
フロントエンドJavaScriptから実行していますか? – juunas
私はこれをWindows Scripting Hostのインアプリインスタンスから実行しています。ウェブブラウザは関係ありません。アプリケーション自体はWindowsサービスとして実行されます。つまり、GUIは関係しません。ある意味では、NodeJSが行うことに似ています。 NodeJSを除いて、WSHをインスタンス化するWindows実行可能ファイル(Delphiで書かれています)です。 あなたの質問にお答えします。 – Filipus
あなたのtenantID(appEndPointという変数)が "contoso.com"(組織の場合)のように見えるようにしたいだけです。 – piisexactly3