OAuth 2.0-Mechanismus

In diesem Dokument wird der SASL XOAUTH2-Mechanismus für die Verwendung mit den IMAP-Befehlen AUTHENTICATE, POP AUTH und SMTP AUTH definiert. Dieser Mechanismus ermöglicht die Verwendung von OAuth 2.0-Zugriffstokens zur Authentifizierung beim Gmail-Konto eines Nutzers.

Verwenden von OAuth 2.0

Machen Sie sich zunächst mit dem Thema OAuth 2.0 für den Zugriff auf Google APIs verwenden vertraut. In diesem Dokument werden die Funktionsweise von OAuth 2.0 und die Schritte zum Schreiben eines Clients erläutert.

Arbeitsbeispiele finden Sie auch im XOAUTH2-Beispielcode.

OAuth 2.0-Bereiche

Der Bereich für IMAP-, POP- und SMTP-Zugriff ist https://mail.google.com/. Wenn Sie Zugriff auf den vollständigen E-Mail-Bereich Ihrer IMAP-, POP- oder SMTP-Anwendung anfordern, muss diese unserer Nutzerdatenrichtlinie der Google API-Dienste entsprechen.

  • Damit deine App genehmigt werden kann, muss sie https://mail.google.com/ vollständig nutzen.
  • Wenn für Ihre Anwendung https://mail.google.com/ nicht erforderlich ist, migrieren Sie zur Gmail API und verwenden Sie detailliertere eingeschränkte Bereiche.

Domainweite Delegierung für Google Workspace

Wenn Sie eine Google Workspace domainweite Delegierung mit Dienstkonten für den Zugriff auf Google Workspace Nutzerpostfächer über IMAP verwenden möchten, können Sie Ihren Client stattdessen mit dem Bereich https://www.googleapis.com/auth/gmail.imap_admin autorisieren.

Wenn für diesen Bereich autorisiert wird, verhalten sich IMAP-Verbindungen anders:

  • Alle Labels werden über IMAP angezeigt, auch wenn Nutzer in den Gmail-Einstellungen die Option „In IMAP anzeigen“ für das Label deaktiviert haben.
  • Alle Nachrichten werden über IMAP angezeigt, unabhängig davon, was der Nutzer in den Gmail-Einstellungen unter „Grenzen für die Ordnergröße“ festgelegt hat.

Der SASL-XOAUTH2-Mechanismus

Mit dem XOAUTH2-Mechanismus können Clients OAuth 2.0-Zugriffstokens an den Server senden. Das Protokoll verwendet codierte Werte, die in den folgenden Abschnitten gezeigt werden.

Erste Kundenantwort

Die anfängliche Clientantwort SASL XOAUTH2 hat das folgende Format:

base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")

Verwenden Sie den in RFC 4648 definierten base64-Codierungsmechanismus. ^A steht für Strg + A (\001).

Vor der base64-Codierung könnte die anfängliche Clientantwort beispielsweise so aussehen:

user=someuser@example.com^Aauth=Bearer ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg^A^A

Nach der base64-Codierung sieht das so aus (zur Verdeutlichung Zeilenumbrüche eingefügt):

dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52
YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==

Fehlerantwort

Eine erste Clientantwort, die einen Fehler verursacht, führt dazu, dass der Server eine Challenge mit einer Fehlermeldung im folgenden Format sendet:

base64({JSON-Body})

JSON-Body enthält drei Werte: status, schemes und scope. Beispiel:

eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb3BlIjoiaHR0cHM6Ly9t
YWlsLmdvb2dsZS5jb20vIn0K

Nach der base64-Decodierung wird daraus (zur Verdeutlichung formatiert):

{
  "status":"401",
  "schemes":"bearer",
  "scope":"https://mail.google.com/"
}

Gemäß dem SASL-Protokoll müssen Clients eine leere Antwort auf diese Aufgabe senden.

IMAP-Protokollaustausch

In diesem Abschnitt wird erläutert, wie Sie SASL XOAUTH2 mit dem Gmail-IMAP-Server verwenden.

Erste Kundenantwort

Zur Anmeldung mit dem SASL-XOAUTH2-Mechanismus ruft der Client den Befehl AUTHENTICATE mit dem Mechanismus-Parameter von XOAUTH2 und der ersten Clientantwort wie oben erstellt auf. Beispiel:

[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...]

Hinweise zum IMAP-Protokollaustausch:

  • Der IMAP-Befehl AUTHENTICATE ist in RFC 3501 dokumentiert.
  • Die SASL-IR-Funktion ermöglicht das Senden der ersten Clientantwort in der ersten Zeile des Befehls AUTHENTICATE, sodass für die Authentifizierung nur ein Umlauf erforderlich ist. SASL-IR ist in RFC 4959 dokumentiert.
  • Die Funktion AUTH=XOAUTH2 gibt an, dass der Server den in diesem Dokument definierten SASL-Mechanismus unterstützt. Dieser Mechanismus wird aktiviert, indem XOAUTH2 als erstes Argument für den Befehl AUTHENTICATE angegeben wird.
  • Die Zeilenumbrüche in den Befehlen AUTHENTICATE und CAPABILITY dienen der Verständlichkeit und wären in den tatsächlichen Befehlsdaten nicht vorhanden. Das gesamte base64-Argument sollte ein fortlaufender String ohne eingebettetes Leerzeichen sein, sodass der gesamte AUTHENTICATE-Befehl aus einer einzigen Textzeile besteht.

Fehlerantwort

Authentifizierungsfehler werden auch über den IMAP-Befehl AUTHENTICATE zurückgegeben:

[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

Hinweise zum IMAP-Protokollaustausch:

  • Der Client sendet eine leere Antwort ("\r\n") auf die Aufgabe mit der Fehlermeldung.

POP-Protokollaustausch

In diesem Abschnitt wird erläutert, wie Sie SASL XOAUTH2 mit dem Gmail-POP-Server verwenden.

Erste Kundenantwort

Zur Anmeldung mit dem SASL-XOAUTH2-Mechanismus ruft der Client den Befehl AUTH mit dem Mechanismus-Parameter von XOAUTH2 und der ersten Clientantwort wie oben erstellt auf. Beispiel:

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

Hinweise zum POP-Protokollaustausch:

  • Der POP-Befehl AUTH ist in RFC 1734 dokumentiert.
  • Die Zeilenumbrüche im Befehl AUTH dienen der Verständlichkeit und wären in den tatsächlichen Befehlsdaten nicht vorhanden. Das gesamte base64-Argument sollte ein fortlaufender String ohne eingebettetes Leerzeichen sein, sodass der gesamte AUTH-Befehl aus einer einzigen Textzeile besteht.

Fehlerantwort

Authentifizierungsfehler werden auch über den POP-Befehl AUTH zurückgegeben:

[connection begins]
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: + eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUi
OiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==

SMTP-Protokollaustausch

In diesem Abschnitt wird erläutert, wie Sie SASL XOAUTH2 mit dem Gmail-SMTP-Server verwenden.

Erste Kundenantwort

Zur Anmeldung mit dem XOAUTH2-Mechanismus ruft der Client den Befehl AUTH mit dem Mechanismus-Parameter von XOAUTH2 und der ersten Clientantwort wie oben erstellt auf. Beispiel:

[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...]

Hinweise zum SMTP-Protokollaustausch:

  • Der SMTP-Befehl AUTH ist in RFC 4954 dokumentiert.
  • Die Zeilenumbrüche im Befehl AUTH dienen der Verständlichkeit und wären in den tatsächlichen Befehlsdaten nicht vorhanden. Das gesamte base64-Argument sollte ein fortlaufender String ohne eingebettetes Leerzeichen sein, sodass der gesamte AUTH-Befehl aus einer einzigen Textzeile besteht.

Fehlerantwort

Authentifizierungsfehler werden auch über den SMTP-Befehl AUTH zurückgegeben:

[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...]

Hinweise zum SMTP-Protokollaustausch:

  • Der Client sendet eine leere Antwort ("\r\n") auf die Aufgabe mit der Fehlermeldung.

Verweise