OAuth を使用して IMAP、POP、SMTP 接続を認証する

OAuth 認証を使用して IMAP、POP、SMTP プロトコルに接続し、Office 365 ユーザーのメール データにアクセスする方法について説明します。

以下で説明する IMAP、POP、SMTP プロトコルの OAuth2 サポートは、Microsoft 365 (Office on the web を含む) と Outlook.com ユーザーの両方でサポートされます。

OAuth 2.0 プロトコルに精通していない場合は、まず、「Microsoft ID プラットフォームの概要の OAuth 2.0 プロトコル」をお読みください。 OAuth 2.0 プロトコルを実装してユーザーを認証し、安全な API にアクセスする Microsoft 認証ライブラリ (MSAL) の詳細については、「MSAL の概要」を参照してください。

Azure Active Directory (Azure AD) によって提供されるOAuth認証サービスを使用して、アプリケーションがIMAP、POP、またはSMTPプロトコルで接続してOffice 365のExchange Onlineにアクセスできるようにすることができます。 アプリケーションで OAuth を使用するには、次の操作を行う必要があります:

  1. アプリケーションをAzure ADに登録します
  2. トークン サーバーからアクセス トークンを取得します。
  3. アクセス トークンを使用して接続リクエストを認証します。

アプリケーションを登録する

OAuth を使用するには、アプリケーションを Azure Active Directory に登録する必要があります。

Microsoft ID プラットフォームにアプリケーションを登録する」に記載されている手順に従って、新しいアプリケーションを作成します。

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

MSAL クライアント ライブラリのいずれかを使用して、クライアント アプリケーションからアクセス トークンを取得できます。

または、次のリストから適切なフローを選択し、対応する手順に従って基になる ID プラットフォーム REST API を呼び出して、アクセス トークンを取得できます。

  1. OAuth2 認証コード フロー
  2. OAuth2 デバイス認可付与フロー
  3. OAuth2 クライアント資格情報付与フロー

アプリケーションを承認し、アクセス トークンをリクエストする場合は、Outlook URL を含む完全なスコープを指定してください。

プロトコル アクセス許可のスコープの文字列
IMAP https://outlook.office.com/IMAP.AccessAsUser.All
POP https://outlook.office.com/POP.AccessAsUser.All
SMTP AUTH https://outlook.office.com/SMTP.Send

さらに、offline_access のスコープをリクエストすることもできます。 ユーザーが offline_access スコープを承認すると、アプリは Microsoft ID プラットフォーム トークン エンドポイントから更新トークンを取得できます。 更新トークンは長時間使用されます。 以前のアクセス トークンの有効期限が切れると、アプリは新しいアクセス トークンを取得できます。

接続リクエストの認証

Office 365 向けの IMAP および POP メール設定を使用して、Office 365 メール サーバーへの接続を開始します。

SASL XOAUTH2

OAuth 統合では、アプリケーションで SASL XOAUTH2 形式を使用してアクセス トークンをエンコードおよび送信する必要があります。 SASL XOAUTH2 は、ユーザー名とアクセス トークンを次の形式でエンコードします。

base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")

^AControl + A (%x01) を表します。

たとえば、アクセス トークン test@contoso.onmicrosoft.com を使用して EwBAAl3BAAUFFpUAo7J3Ve0bjLBWZWCclRC3EoAA にアクセスする SASL XOAUTH2 形式は次のようになります。

base64("user=test@contoso.onmicrosoft.com^Aauth=Bearer EwBAAl3BAAUFFpUAo7J3Ve0bjLBWZWCclRC3EoAA^A^A")

base64 エンコード後、これは次の文字列に変換されます。 読みやすくするために改行が挿入されます。

dXNlcj10ZXN0QGNvbnRvc28ub25taWNyb3NvZnQuY29tAWF1dGg9QmVhcmVy
IEV3QkFBbDNCQUFVRkZwVUFvN0ozVmUwYmpMQldaV0NjbFJDM0VvQUEBAQ==

Office 365 内の共有メールボックスの SASL XOAUTH2 認証

OAuth を使用して共有メールボックスにアクセスする場合、アプリケーションはユーザーに代わってアクセス トークンを取得する必要がありますが、SASL XOAUTH2 エンコード文字列の userName フィールドを、共有メールボックスのメール アドレスに置き換える必要があります。

IMAP プロトコル Exchange

IMAP サーバー接続を認証するには、クライアントは次の形式の AUTHENTICATE コマンドで応答する必要があります:

AUTHENTICATE XOAUTH2 <base64 string in XOAUTH2 format>

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: C01 CAPABILITY
S: * CAPABILITY … AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: A01 OK AUTHENTICATE completed.

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins]
S: * CAPABILITY … AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: A01 NO AUTHENTICATE failed.

POP プロトコル Exchange

POP サーバー接続を認証するには、クライアントは次の形式の AUTH コマンドで応答する必要があります。

AUTH XOAUTH2 
<base64 string in XOAUTH2 format>   

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins] 
C: AUTH XOAUTH2     
S: +    
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYX   
JlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0  
Q2cBAQ==    
S: +OK User successfully authenticated. 
[connection continues...]   

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins] 
C: AUTH XOAUTH2     
S: +    
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY    
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj   
l0Q2cBAQ=   
S: -ERR Authentication failure: unknown user name or bad password.  

SMTP プロトコル Exchange

メモ SMTP Oauth 2.0 クライアント資格情報フローを使用した現在のテストと同様に、非対話型サインインはサポートされていません。

SMTP サーバー接続を認証するには、クライアントは次の形式の AUTH コマンドで応答する必要があります:

AUTH XOAUTH2 <base64 string in XOAUTH2 format>

認証が成功するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: auth xoauth2
S: 334
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 235 2.7.0 Authentication successful
[connection continues...]

認証エラーが発生するクライアントとサーバーのメッセージ交換の例:

[connection begins]
C: auth xoauth2
S: 334
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 535 5.7.3 Authentication unsuccessful [SN2PR00CA0018.namprd00.prod.outlook.com]

クライアント資格情報付与フローを使用して IMAP 接続と POP 接続を認証する

Exchange のサービス プリンシパルは、アプリケーションが POP および IMAP プロトコルを使用してクライアント資格情報フローを介して Exchange メールボックスにアクセスできるようにするために使用されます。

POP と IMAP のアクセス許可を AAD アプリケーションに追加する

  1. Azure portalで、Azure AD アプリケーションの管理ビューで [ API のアクセス許可 ] ブレードを選択します。

  2. [アクセス許可の追加] を選択します。

  3. [組織で使用する API] タブを選択し、「Office 365 Exchange Online」を検索します。

  4. [アプリケーションのアクセス許可] をクリックします。

  5. POP アクセスの場合は、POP.AccessAsApp アクセス許可 を選択します。 IMAP アクセスの場合は、IMAP.AccessAsApp アクセス許可 を選択します。

    pop-imap-permission

  6. アクセス許可の種類を選択したら、[ アクセス許可の追加] を選択します。

これで、POP または IMAP アプリケーションのアクセス許可が AAD アプリケーションのアクセス許可に追加されます。

POP または IMAP を使用して Exchange メールボックスにアクセスするには、AAD アプリケーションがテナントごとにテナント管理者の同意を取得する必要があります。 詳細については、 テナント管理者の同意プロセスを参照してください。

ISV/パートナーが「任意の組織ディレクトリのアカウント」オプションを使用してAzure ADアプリケーションを登録した場合は、承認要求URLを利用して、次の手順を使用してこのアプリケーションを追加し、同意する必要があります。

OAuth 2.0 テナント承認要求では、POP アプリケーション スコープと IMAP アプリケーション スコープの両方について、scope クエリ パラメーターを https://ps.outlook.com/.default にする必要があります。 OAuth 2.0 承認要求 URL の例を次に示します:

https://login.microsoftonline.com/{tenant}/v2.0/adminconsent?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>&scope=https://ps.outlook.com/.default

「この組織のディレクトリ内のアカウントのみ"」を使用して独自のテナントにアプリケーションを登録した場合は、Azure AD管理センター内のアプリケーション構成ページを使用して管理者の同意を付与するだけで、承認要求 URLを使用する必要はありません´。

image

Exchange でサービス プリンシパルを登録する

Azure AD アプリケーションがテナント管理者の同意を得たら、テナント管理者は Exchange Online PowerShell を使用して AAD アプリケーションのサービス プリンシパルを Exchange に登録する必要があります。 これは、New-ServicePrincipal コマンドレットによって有効になります。

New-ServicePrincipal コマンドレットを使用するには、ExchangeOnlineManagement をインストールし、次のスニペットに示すようにテナントに接続します。

Install-Module -Name ExchangeOnlineManagement -allowprerelease
Import-module ExchangeOnlineManagement 
Connect-ExchangeOnline -Organization <tenantId>

これらの手順を実行した後も New-ServicePrincipal コマンドレットの実行中にエラーが発生する場合は、ユーザーが Exchange Online で操作を実行するのに十分なアクセス許可を持っていないことが原因である可能性があります。

Azure AD アプリケーションのサービス プリンシパルを Exchange に登録する例を次に示します:

New-ServicePrincipal -AppId <APPLICATION_ID> -ServiceId <OBJECT_ID> [-Organization <ORGANIZATION_ID>]

テナント管理者は、テナント上の AAD アプリケーションのエンタープライズ アプリケーション インスタンスで、上記で参照されているサービス プリンシパル識別子を見つけることができます。 テナントのエンタープライズ アプリケーション インスタンスの一覧は、Azure Portal の Azure Active Directory ビューの [エンタープライズ アプリケーション ] ブレードにあります。

登録されたサービス プリンシパルの識別子は、Get-ServicePrincipal コマンドレットを使用して取得できます。

Get-ServicePrincipal | fl

OBJECT_IDは、アプリケーション登録の Enterprise Application ノード (Azure Portal) の [概要] ページのオブジェクト ID です。 [アプリの登録] ノードの [概要] のオブジェクト ID ではありません 。 正しくないオブジェクト ID を使用すると、認証エラーが発生します。

テナント管理者は、アプリケーションによるアクセスを許可される特定のメールボックスをテナントに追加できるようになりました。 これは、Add-MailboxPermission コマンドレットで行います。

アプリケーションのサービス プリンシパルに 1 つのメールボックスへのアクセス権を付与する方法の例を次に示します:

Add-MailboxPermission -Identity "john.smith@contoso.com" -User 
<SERVICE_PRINCIPAL_ID> -AccessRights FullAccess

Azure AD アプリケーションは、OAuth 2.0 クライアント資格情報付与フローを使用して、POP または IMAP プロトコルを介して許可されたメールボックスにアクセスできるようになりました。 詳細については、 Microsoft ID プラットフォームのアクセス許可と同意に関するページの手順を参照してください。

アクセス トークン要求の本文ペイロードの scope プロパティで https://outlook.office365.com/.default を使用する必要があります。

生成されたアクセス トークンは、前述のように、SASL XOAUTH2 形式を介して POP および IMAP 接続を認証するためのトークンとして使用できます。

関連項目