このドキュメントでは、IMAP AUTHENTICATE
コマンド、POP AUTH
コマンド、SMTP AUTH
コマンドで使用する SASL XOAUTH2 メカニズムを定義します。このメカニズムでは、OAuth 2.0 アクセス トークンを使用してユーザーの Gmail アカウントを認証できます。
OAuth 2.0 の使用
まず、OAuth 2.0 を使用した Google API へのアクセスをご確認ください。このドキュメントでは、OAuth 2.0 の仕組みと、クライアントの作成に必要な手順について説明します。
動作例については、XOAUTH2 サンプルコードもご覧ください。
OAuth 2.0 スコープ
IMAP、POP、SMTP アクセスのスコープは https://mail.google.com/
です。IMAP、POP、SMTP アプリのメール スコープ全体へのアクセスをリクエストする場合は、Google API サービス: ユーザーデータに関するポリシーに準拠している必要があります。
- 承認を受けるには、アプリで
https://mail.google.com/
が完全に使用されていることを示す必要があります。 - アプリで
https://mail.google.com/
が不要な場合は、Gmail API に移行し、より詳細な制限付きスコープを使用します。
のドメイン全体の委任
サービス アカウントを使用して ドメイン全体の委任を使用し、IMAP 経由でユーザーのメールボックスにアクセスする場合は、代わりにスコープ https://www.googleapis.com/auth/gmail.imap_admin
を使用してクライアントを承認できます。
このスコープで承認されると、IMAP 接続の動作は異なります。
- ユーザーが Gmail の設定でラベルの [IMAP で表示] を無効にした場合でも、すべてのラベルが IMAP 経由で表示されます。
- ユーザーが Gmail の設定で [フォルダサイズの制限] に設定したものに関係なく、すべてのメールが IMAP 経由で表示されます。
SASL XOAUTH2 メカニズム
XOAUTH2 メカニズムを使用すると、クライアントは OAuth 2.0 アクセス トークンをサーバーに送信できます。このプロトコルでは、次のセクションで説明するエンコードされた値を使用します。
クライアントの最初の対応
SASL XOAUTH2 の最初のクライアント レスポンスの形式は次のとおりです。
base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")
RFC 4648 で定義されている Base64 エンコード メカニズムを使用します。^A
は Ctrl+A(\001)を表します。
たとえば、Base64 エンコード前は、最初のクライアント レスポンスは次のようになります。
user=someuser@example.com^Aauth=Bearer ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg^A^A
base64 エンコードすると、次のように変換されます(わかりやすくするために改行を入れています)。
dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52
YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
エラー レスポンス
エラーが発生した最初のクライアント レスポンスにより、サーバーは次の形式のエラー メッセージを含むチャレンジを送信します。
base64({JSON-Body})
JSON-Body には、status
、schemes
、scope
の 3 つの値が含まれています。次に例を示します。
eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb3BlIjoiaHR0cHM6Ly9t
YWlsLmdvb2dsZS5jb20vIn0K
base64 デコードすると、次のように変換されます(わかりやすくフォーマットしています)。
{
"status":"401",
"schemes":"bearer",
"scope":"https://mail.google.com/"
}
SASL プロトコルでは、クライアントがこのチャレンジに空のレスポンス(応答)を送信する必要があります。
IMAP プロトコル交換
このセクションでは、Gmail IMAP サーバーで SASL XOAUTH2 を使用する方法について説明します。
クライアントの最初の対応
SASL XOAUTH2 メカニズムでログインするには、クライアントは、メカニズム パラメータ XOAUTH2
と、上記で作成した初期クライアント レスポンスを指定して AUTHENTICATE
コマンドを呼び出します。次に例を示します。
[connection begins]
C: C01 CAPABILITY
S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA XLIST
CHILDREN XYZZY SASL-IR AUTH=XOAUTH2 AUTH=XOAUTH
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvb
QFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG
1semRHRXVZMjl0Q2cBAQ==
S: A01 OK Success
[connection continues...]
IMAP プロトコル交換に関する注意事項は次のとおりです。
- IMAP
AUTHENTICATE
コマンドについては、RFC 3501 をご覧ください。 - SASL-IR 機能を使用すると、
AUTHENTICATE
コマンドの最初の行で最初のクライアント レスポンスを送信できるため、認証に必要なラウンドトリップは 1 回だけです。SASL-IR については、RFC 4959 をご覧ください。 - AUTH=XOAUTH2 機能は、サーバーがこのドキュメントで定義された SASL メカニズムをサポートしていることを宣言します。このメカニズムは、
AUTHENTICATE
コマンドの最初の引数として XOAUTH2 を指定して有効にします。 AUTHENTICATE
コマンドとCAPABILITY
コマンドの行区切りはわかりやすくするためであり、実際のコマンドデータには含まれません。base64 引数全体は、AUTHENTICATE
コマンド全体が 1 行のテキストで構成されるように、空白文字を含めずに連続した 1 つの文字列にする必要があります。
エラー レスポンス
認証エラーは、IMAP AUTHENTICATE
コマンドからも返されます。
[connection begins]
S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA XLIST
CHILDREN XYZZY SASL-IR AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQ
FhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1s
emRHRXVZMjl0Q2cBAQ==
S: + eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb
3BlIjoiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vIn0K
C:
S: A01 NO SASL authentication failed
IMAP プロトコル交換に関する注意事項は次のとおりです。
- クライアントは、エラー メッセージを含む空のレスポンス(\r\n)をチャレンジに送信します。
POP プロトコル交換
このセクションでは、Gmail POP サーバーで SASL XOAUTH2 を使用する方法について説明します。
クライアントの最初の対応
SASL XOAUTH2 メカニズムでログインするには、クライアントは、メカニズム パラメータ XOAUTH2
と、上記で作成した初期クライアント レスポンスを指定して AUTH
コマンドを呼び出します。次に例を示します。
[connection begins]
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYX
JlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0
Q2cBAQ==
S: +OK Welcome.
[connection continues...]
POP プロトコル交換に関する注意事項:
- POP
AUTH
コマンドについては、RFC 1734 をご覧ください。 AUTH
コマンドの改行はわかりやすくするためのもので、実際のコマンドデータには含まれません。base64 引数全体は、AUTH
コマンド全体が 1 行のテキストで構成されるように、空白文字を含めずに連続した 1 つの文字列にする必要があります。
エラー レスポンス
認証エラーは、POP AUTH
コマンドからも返されます。
[connection begins]
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: + eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUi
OiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
SMTP プロトコル交換
このセクションでは、Gmail SMTP サーバーで SASL XOAUTH2 を使用する方法について説明します。
クライアントの最初の対応
XOAUTH2 メカニズムでログインするには、クライアントは、メカニズム パラメータ XOAUTH2
と、上記で作成した初期クライアント レスポンスを指定して AUTH
コマンドを呼び出します。次に例を示します。
[connection begins]
S: 220 mx.google.com ESMTP 12sm2095603fks.9
C: EHLO sender.example.com
S: 250-mx.google.com at your service, [172.31.135.47]
S: 250-SIZE 35651584
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
S: 250-ENHANCEDSTATUSCODES
S: 250 PIPELINING
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 235 2.7.0 Accepted
[connection continues...]
SMTP プロトコル交換に関する注意事項:
- SMTP
AUTH
コマンドについては、RFC 4954 をご覧ください。 AUTH
コマンドの改行はわかりやすくするためのもので、実際のコマンドデータには含まれません。base64 引数全体は、AUTH
コマンド全体が 1 行のテキストで構成されるように、空白文字を含めずに連続した 1 つの文字列にする必要があります。
エラー レスポンス
認証エラーは、SMTP AUTH
コマンドからも返されます。
[connection begins]
S: 220 mx.google.com ESMTP 12sm2095603fks.9
C: EHLO sender.example.com
S: 250-mx.google.com at your service, [172.31.135.47]
S: 250-SIZE 35651584
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
S: 250-ENHANCEDSTATUSCODES
S: 250 PIPELINING
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJl
ciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cB
AQ==
S: 334 eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb
3BlIjoiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vIn0K
C:
S: 535-5.7.1 Username and Password not accepted. Learn more at
S: 535 5.7.1 https://support.google.com/mail/?p=BadCredentials hx9sm5317360pbc.68
[connection continues...]
SMTP プロトコル交換に関する注意事項:
- クライアントは、エラー メッセージを含む空のレスポンス(\r\n)をチャレンジに送信します。
参照
- OAUTH2: OAuth 2.0 を使用して Google API にアクセスする
- SMTP: RFC 2821: Simple Mail Transfer Protocol
- IMAP: RFC 3501: INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1
- POP: RFC 1081: Post Office Protocol - Version 3
- SASL: RFC 4422: Simple Authentication and Security Layer(SASL)
- JSON: RFC 4627: JavaScript Object Notation の application/json メディアタイプ
- BASE64: RFC 4648: Base16、Base32、Base64 データ エンコード
- SASL-IR: RFC 4959: Simple Authentication and Security Layer(SASL)の初期クライアント レスポンス用の IMAP 拡張機能
- SMTP-AUTH: RFC 4954: 認証のための SMTP サービス拡張機能