响应服务器535.5.7.0AUTH,使用 OAuth 对 IMAP、POP 或 SMTP 连接进行身份验证

使用 OAuth 对 IMAP、POP 或 SMTP 连接进行身份验证

02/19/2020

本文内容

了解如何使用 OAuth 身份验证连接 IMAP、POP 或 SMTP 协议以及访问 Office 365 用户的电子邮件数据。

OAuth2 支持 IMAP、POP、SMTP 协议(如下面所述)对 Microsoft 365 ((包括 web 上的 Office) 和 Outlook.com 用户)都受支持。

如果你不熟悉 OAuth 2.0 协议,请先阅读 Microsoft identity platform 概述中的 OAuth 2.0 协议。 若要了解有关 Microsoft 身份验证 Libariers (MSAL) 的详细信息,该协议可实施 OAuth 2.0 协议以对用户进行身份验证并访问安全 Api,请阅读 MSAL 概述。

您可以使用 Azure Active Directory 提供的 OAuth 身份验证服务,使应用程序能够与 IMAP、POP 或 SMTP 协议连接,以便在 Office 365 中访问 Exchange Online。 若要将 OAuth 与应用程序一起使用,您需要执行以下操作:

使用 Azure Active Directory 注册应用程序。

在 Azure Active Directory 中配置应用程序。

从令牌服务器获取访问令牌。

注册应用程序

若要使用 OAuth,必须向 Azure Active Directory 注册应用程序。

配置应用程序

确保添加以下一个或多个与要与之集成的协议对应的权限范围。 在 " 添加权限 向导" 中,选择 " Microsoft Graph ",然后选择 " 委派权限 " 以查找列出的以下权限范围。

协议

权限范围

IMAP

IMAP.AccessAsUser.All

弹出式

POP.AccessAsUser.All

SMTP 身份验证

SMTP.Send

获取访问令牌

您可以使用我们的 MSAL 客户端库 之一从客户端应用程序中获取访问令牌。

或者,也可以从以下列表中选择一个合适的流,并按照相应的步骤调用基础标识平台 REST Api 并检索访问令牌。

不支持通过 OAuth2 客户端凭据授予流的对 IMAP、POP、SMTP 身份验证协议的 OAuth 访问权限。 如果您的应用程序需要对 Microsoft 365 组织中的所有邮箱具有持久访问权限,我们建议您使用 Microsoft Graph Api,这些 Api 允许没有用户的访问,启用粒度权限,并允许管理员将此类访问权限限定为特定的一组邮箱。

在授权应用程序和请求访问令牌时,请确保指定完整的作用域(包括 Outlook 资源 Url)。

协议

权限范围字符串

IMAP

https://outlook.office.com/IMAP.AccessAsUser.All

弹出式

https://outlook.office.com/POP.AccessAsUser.All

SMTP 身份验证

https://outlook.office.com/SMTP.Send

此外,还可以请求 offline_access 范围。 当用户批准 offline_access 范围时,您的应用程序可以从 Microsoft identity platform 令牌终结点接收刷新令牌。 刷新令牌的生存期较长。 您的应用程序可以将新的访问令牌作为旧令牌过期。

对连接请求进行身份验证

SASL XOAUTH2

与的 OAuth 集成要求您的应用程序使用 SASL XOAUTH2 格式编码和传输访问令牌。 SASL XOAUTH2 将用户名、访问令牌按以下格式进行编码:

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

^A表示 Control + A () 的控件 %x01 。

例如,使用 access 令牌访问的 SASL XOAUTH2 格式 test@contoso.onmicrosoft.com EwBAAl3BAAUFFpUAo7J3Ve0bjLBWZWCclRC3EoAA 为:

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

在 base64 编码之后,这会转换为以下字符串。 请注意,插入换行符的目的是为了提高可读性。

dXNlcj10ZXN0QGNvbnRvc28ub25taWNyb3NvZnQuY29tAWF1dGg9QmVhcmVy

IEV3QkFBbDNCQUFVRkZwVUFvN0ozVmUwYmpMQldaV0NjbFJDM0VvQUEBAQ==

Office 365 中的共享邮箱的 SASL XOAUTH2 身份验证

如果使用 OAuth 的共享邮箱访问,应用程序需要代表用户获取访问令牌,而将 SASL XOAUTH2 编码字符串中的 userName 字段替换为共享邮箱的电子邮件地址。

IMAP 协议交换

若要对 IMAP 服务器连接进行身份验证,客户端将必须使用 AUTHENTICATE 以下格式的命令进行响应:

AUTHENTICATE XOAUTH2

导致身份验证成功的示例客户端/服务器消息交换:

[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 协议交换

若要对 POP 服务器连接进行身份验证,客户端必须使用 AUTH 以下格式的命令拆分成两行:

AUTH XOAUTH2

导致身份验证成功的示例客户端/服务器消息交换:

[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 协议交换

若要对 SMTP 服务器连接进行身份验证,客户端将必须使用 AUTH 以下格式的命令进行响应:

AUTH XOAUTH2

导致身份验证成功的示例客户端/服务器消息交换:

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

另请参阅