使用 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]
另请参阅