使用 OAuth 登录的 Google 电子邮件返回 Chimlkat.Imap 的无效凭据

Posted

技术标签:

【中文标题】使用 OAuth 登录的 Google 电子邮件返回 Chimlkat.Imap 的无效凭据【英文标题】:Google Email Login with OAuth Returns Invalid credentials for Chimlkat.Imap 【发布时间】:2020-11-06 13:07:57 【问题描述】:

尝试使用 Chilkat IMAP 电子邮件组件通过带有 OAuth2 的 IMAP 访问 Google 电子邮件帐户。我正在从服务器响应中收到这个...

serverResponse: aaab NO [AUTHENTICATIONFAILED] 无效凭据 (失败)

我们正在使用 VB.NET,我正在按照https://www.example-code.com/csharp/gmail_imap_login_oauth2.asp 的示例进行操作。使用 SSL 和端口 993 连接到 imap.gmail.com。我正在设置 Imap.AuthMethod = "XOAUTH2" 并使用 AuthToken 而不是密码。 Imap.Login(LoginName, AuthToken) 是错误消息的来源。

我已使用 Gmail 帐户启用 IMAP,并且启用了不太安全的应用程序。我确认为密码设置了正确的身份验证令牌,并且我检查了 API 范围是否正确设置为 https://mail.google.com/。如果我直接尝试登录名和密码,则登录成功。

不确定还需要检查什么来找出导致凭据无效错误的原因。

【问题讨论】:

你好@kencleary!我无法复制您的问题。我可以看到您使用的是第三方 Chilkat 库,而不是官方的Google Gmail API。为了防止 Chilkat 端的任何错误配置,您能否尝试在没有它的情况下连接到 Gmail API?您可以使用.NET quickstart 作为参考。 谢谢雅克。我能够让它连接并读取 .NET 快速入门链接之后的文件夹。我可以把它带回奇尔卡特,看看他们怎么说。 【参考方案1】:

找出问题所在。对于令牌,我将其设置为“Bearer ya29.a0AfH6SMDF ...”,这是我们为用于日历同步的 nSoftware 组件设置的。我删除了令牌的“Bearer”部分,并且能够使用 Chilkat IMAP 电子邮件组件正常登录。

【讨论】:

【参考方案2】:

这个问题的原因找到了。

在对 Login 的调用中,应用程序传递“Bearer”而不是“”作为密码:

正确: 成功 = imap.Login("user@gmail.com","");

不正确: 成功 = imap.Login("user@gmail.com","Bearer");

访问令牌被认为是密码。 Chilkat 在编写发送到 IMAP 服务器的 XOAUTH2 数据时,会在内部添加所需的“Bearer”字符串。

【讨论】:

【参考方案3】:

我写了这篇博文来了解整个过程:https://cknotes.com/gmail-imap-oauth2-a-walkthrough/

    在https://console.developers.google.com/apis/credentials,创建凭据(客户端 ID、客户端密码)并定义重定向 URL 从您的应用程序中获取初始 OAuth2 令牌的代码。 使用 OAuth2 在 IMAP 协议中进行身份验证的代码。 刷新令牌的代码

我还上传了一些演示 1 和 2 的 YouTube 视频。

【讨论】:

我们获取令牌并刷新它。问题是尝试使用该令牌通过 Chilkat IMAP 电子邮件组件登录。我们一直在使用 Chilkat 组件通过 IMAP 仅使用标准登录名和密码登录。我们所做的唯一更改是,如果我们使用令牌,我们设置 AuthMethod 将密码更改为令牌。根据 Chilkat 文档,我认为这是使用身份验证令牌登录的唯一更改,对吧?

以上是关于使用 OAuth 登录的 Google 电子邮件返回 Chimlkat.Imap 的无效凭据的主要内容,如果未能解决你的问题,请参考以下文章

Google oAuth登录 - 如何仅允许列入白名单的电子邮件登录我的应用

Google OAuth 登录错误:凭据无效

Google OAuth2 登录 - 获取 YouTube 昵称和真实电子邮件地址

Google oauth 不返回电子邮件护照身份验证

Google Adwords API with OAuth2 如何获取授权用户的电子邮件?

需要Google OAuth 2.0架构建议通过Java邮件Api发送Smtp邮件