web-dev-qa-db-ja.com

サービス/デーモンアプリケーションでEWSマネージAPIのOAuth2アクセストークンを取得する方法

シナリオ

Azure VMにExchange Online環境とサービス/ daemin(インタラクティブユーザーなし)アプリケーションがあります。サービスはEWSマネージAPIを使用して、anyテナントユーザーのメールボックス内の電子メールを処理します。現在、EWSクライアントは基本認証を使用しています。Microsoftによると、Exchange OnlineへのアクセスはEWSでサポートされなくなります。

質問/問題

したがって、サービス/デーモンアプリケーションがEWSマネージAPIで使用するための有効なアクセストークンを取得する方法を見つける必要があります。

私の調査結果

次の 記事 は、EWSマネージAPIでOAuth 2.0を使用する例を示しています。この例は機能しますが、同意を取得するインタラクティブな方法を使用します(サインインフォームはユーザーが自分自身を認証し、要求された権限をアプリケーションに付与します)。これは、インタラクティブなユーザーがいないため、サービス/デーモンアプリのシナリオには適していません。

サービス/デーモンアプリケーションの場合、client credential認証フローを使用する必要があります。

登録済みアプリケーション

https://aad.portal.Azure.com ポータルで管理者アカウントを使用するアプリケーションをAzure Active Directoryに登録しました。登録済みアプリケーションのクライアントシークレットを追加しました。

前述の article は、https://Outlook.office.com/EWS.AccessAsUser.Allscopeとして使用します。しかし、私はポータルでそのようなURLの許可を見つけられませんでした。 Office 365 Exchange Online> Application permissions> Mailで次の権限のみが見つかりました:

  1. https://Outlook.office365.com/Mail.Readサインインしたユーザーなしで、アプリがすべてのメールボックスのメールを読み取ることを許可します
  2. https://Outlook.office365.com/Mail.ReadWriteサインインしているユーザーなしで、アプリがすべてのメールボックスのメールを作成、読み取り、更新、削除できるようにします。

両方を追加して、すべてのユーザーに管理者の同意を与えました。

アクセストークンを取得する

テストと簡単のため、認証ライブラリ(ADAL、MSALなど)は使用しませんでした。 Postmanを使用してアクセストークンを取得し、デバッグでtoken変数を設定しました(後のコードスニペットを参照)。

さまざまなエンドポイントでアクセストークンを取得しようとしました。

  1. OAuth 2.0トークンエンドポイント(v2)
    POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token
        grant_type=client_credentials
        client_id=*** 
        client_secret=***
        scope=https://Outlook.office.com/EWS.AccessAsUser.All

この要求を送信すると、次のエラー応答が生成されます。

AADSTS70011:提供されるリクエストには、「スコープ」入力パラメーターを含める必要があります。入力パラメーター 'scope'に指定された値は無効です。スコープ https://Outlook.office.com/EWS.AccessAsUser.All は無効です。

scopehttps://Outlook.office.com/.defaultに変更してみました。アクセストークンが返されましたが、EWSには無効のようです。 EWSクライアントはx-ms-diagnostics応答ヘッダーの次の値で401エラーをスローします:

2000008; reason = "トークンに権限が含まれていないか、権限を理解できません。"; error_category = "invalid_grant"

  1. OAuth 2.0トークンエンドポイント(v1)
    POST: https://login.microsoftonline.com/<TENANT_ID>/oauth2/token
        grant_type=client_credentials
        client_id=*** 
        client_secret=***
        resource=https://Outlook.office.com

アクセストークンが返されましたが、EWSには無効のようです。 EWSクライアントは、#1で説明したように、x-ms-diagnostics応答ヘッダーの値が同じ401エラーをスローします。

EWSマネージAPIで取得したアクセストークンを使用する

以下は、Postmanで取得したアクセストークンを使用してEWSクライアントをテストするために使用したコードサンプルです。

var token = "...";
var client = new ExchangeService
{
    Url = new Uri("https://Outlook.office365.com/EWS/Exchange.asmx"),
    Credentials = new OAuthCredentials(token),
    ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress,
                 "[email protected]"),

};
var folder = Folder.Bind(client, WellKnownFolderName.SentItems);
3
Oleksii

OAuth 2.0クライアント資格情報フロー のMicrosoft公式ドキュメントに従っているときに同じ問題が発生しました

Microsoft IDプラットフォームとOAuth 2.0クライアント資格情報フロー )によると、スコープは「リソース識別子(必要なリソースの.defaultサフィックスが付加されたアプリケーションID URI)( デフォルトスコープドキュメント を参照)。

したがって、問題は、https://Outlook.office.com/EWS.AccessAsUser.Allをリソース識別子に変換する方法です。

実験的に、私はscope=https://Outlook.office365.com/.defaultを使用してそれを機能させることができました。 full_access_as_app(Office 365 Exchange Online /アプリケーションのアクセス許可)を付与し、 管理者の同意を得た

0
Alexey

OAuthを実装しているときにこの問題に直面しました。私のアプリケーションはnotEWSマネージAPI を使用しています。

  1. アプリケーションに権限Office 365 Exchange Online > full_access_as_appを追加しました。
  2. スコープhttps://Outlook.office365.com/.defaultのアクセストークンを取得しました。
POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

form-data = {
  client_id,
  client_secret,
  grant_type: 'client_credentials',
  scope: 'https://Outlook.office365.com/.default',
};
  1. AuthorizationヘッダーおよびExchangeImpersonation SOAPヘッダーとしてリクエストにアクセストークンを追加しました。
<SOAP-ENV:Header>
  <t:ExchangeImpersonation>
    <t:ConnectingSID>
      <t:PrimarySmtpAddress>[email protected]</t:PrimarySmtpAddress>
    </t:ConnectingSID>
  </t:ExchangeImpersonation>
</SOAP-ENV:Header>
0
kushwahav