IMAP+Office365+XOAUTH2:有没有办法在不断开/重新连接到服务器的情况下重新验证新的访问令牌?

6jygbczu  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(232)

所以,上周,我使用IMAP连接到Office365的应用程序突然停止使用基本身份验证(哎呀,感谢微软在没有任何警告的情况下提前关闭)。我试着对这个问题进行了几个小时的故障排除,几乎没有发现任何问题,因为一切都已经配置为使用基本身份验证(并且工作正常)。我只知道他们威胁要关闭Basic Auth已经有一段时间了,新的截止日期是2022年10月。

在对它突然停止工作的原因一无所获后,我最终决定咬紧牙关改用XOAUTH2身份验证机制。经过一天半的反复试验,我把一系列正确的咒语组合在一起,让它正确地工作,我让它工作了。微软的文档近乎垃圾,信息相互冲突,例子令人困惑。此外,IMAP服务器完全没有任何合理的错误响应来说明身份验证失败的原因(只有一条可爱的“无身份验证失败”消息)。

注意:我使用的是客户端凭据流,而AccessToken将在1小时后过期。

所以,问题是:我的应用程序基本上是在空闲和/或处理新邮件时循环。当AccessToken到期时,服务器将响应“Session Inaliated-AccessTokenExpired”,然后关闭或重置连接。这确实有意义,但我更喜欢保持连接打开并重新进行身份验证。

我的第一个想法是在AccessToken到期前1分钟重新发出“身份验证”命令。服务器不喜欢这样,并给我一个“命令接收到无效的状态”。回应。嗯,嗯。

第二个想法是在AccessToken到期前1分钟发出“注销”命令,然后再次“进行身份验证”。然而,微软的IMAP服务器对“注销”的响应是“OK”,然后关闭连接...嗯,嗯。

C: R0001 AUTHENTICATE XOAUTH2
S: +
C: <username:token base64>
S: R0001 OK AUTHENTICATE completed.
C: R0002 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4REV1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CLIENTACCESSRULES CLIENTNETWORKPRESENCELOCATION BACKENDAUTHENTICATE CHILDREN IDLE NAMESPACE LITERAL+
S: R0002 OK CAPABILITY completed.
C: R0003 SELECT INBOX
... <59 mins later> ...
C: R0021 LOGOUT
S: * BYE Microsoft Exchange Server IMAP4 server signing off.
S: R0021 OK LOGOUT completed.
Connection closed.

我确实注意到有一种名为“BACKENDAUTHENTICATE”的服务器功能,但从字面上看,我找不到关于该功能的相关内容或用途的文档。

我真正想要做的只是再次发出类似“身份验证”的命令,但是使用新的AccessToken,然后返回到空闲/新邮件循环。或者可能是一个“REAUTHENTICATE”命令(目前还不存在)。是的,我读过RFC4959,RFC3501,甚至RFC2222(以及许多SO帖子)。

目前,我刚刚接受了连接即将关闭的事实,然后我会转身重新打开一个新的连接……

如果有人有其他好主意,我很想听听。我正在考虑使用他们的Graph API重新实现应用程序,假设我们继续使用Microsoft Office365,这可能是一个稍微更好的长期选择。我确实喜欢IMAP是一种更通用、更被广泛接受的邮箱协议,这也是我最初选择它的原因。

axkjgtzd

axkjgtzd1#

让我试着回答你的一些问题。
我只知道他们威胁要关闭Basic Auth已经有一段时间了,新的截止日期是2022年10月。在没有弄清楚为什么它突然停止工作后

微软表示,在2022年初,他们将选择租户(使用一些未公布的标准),并在12至48小时内禁用除SMTP身份验证之外的所有选定协议的基本身份验证。SMTP身份验证被排除在外,因为它可能会影响重要的操作方面,如多功能设备或发送作业进度更新的PowerShell脚本。当该期限到期时,Microsoft将自动启用基本身份验证。

请参阅此链接:https://office365itpros.com/2021/09/24/basic-authentication-exchange/

我的许多客户端已经禁用了基本身份验证,因此上面的声明是有效的。
我正在使用客户端凭据流,AccessToken将在1小时后过期。

使用客户端凭据流,您不会获得刷新令牌,该令牌可用于在不丢失/丢弃/关闭连接的情况下获得有效令牌。

根据RFC6749(https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3),,不应包括刷新令牌。

正如@Max在他的评论中提到的那样,“RFC3501不包括任何重新验证现有连接的能力”。

由于您不想失去/关闭连接,我建议您使用OAuth2授权码流(https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow),它也将为您提供刷新令牌。

此外,我还建议使用Microsoft身份验证库(MSAL)(https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-overview)
Microsoft身份验证库(MSAL)使开发人员能够从Microsoft身份平台获取令牌,以便对用户进行身份验证并访问受保护的Web API。它可用于提供对Microsoft Graph、其他Microsoft API、第三方Web API或您自己的Web API的安全访问。MSAL支持许多不同的应用程序架构和平台,包括.NET、JavaScript、Java、Python、Android和iOS。

xqkwcwgp

xqkwcwgp2#

您能分享一下您如何使用客户端凭据流来获得IMAP服务器的授权吗?我可以获得访问令牌,但永远无法通过IMAP获得从Office365服务器读取电子邮件的授权。

相关问题