通过GMail XOAUTH登录IMAP时提示“凭据无效”

6
我正在尝试使用OAuth进入IMAP服务器,使用Google提供的PHP示例代码,该代码使用Zend Imap类,但是我未能通过身份验证。 Zend给出的错误信息如下:
Zend_Mail_Storage_Exception [ Error ]: cannot select INBOX, is this a valid transport?

令人烦恼的是,这个错误信息有些混淆,实际上是“无效凭据”。我是怎么知道的?通过调试发送到IMAP套接字的实际命令,我看到了这个:

string(44) "NO Invalid credentials ey9if1544983wid.142
"

我尝试使用telnet和Ruby的gmail_xoauth gem测试,结果表明这不是代码问题,而是其他问题。

从最基本的层面来看,我得到了如下命令:

TAG1 AUTHENTICATE XOAUTH R0VUIGh0dHBzOi8vbWFpbC5nb29nbGUuY29tL21h......etc

这是我得到“无效凭据”错误提示的地方:
TAG2 SELECT "INBOX"

当我执行这个命令时,它返回BAD Unknown command并将我踢出。

我尝试搜索解决此问题的人,但只找到了问题,没有答案。有一些类似的StackOverflow问题:

一个帖子显示了一个人在Python中遇到完全相同的问题。

这篇文章显示了有人试图使用OAuth 2进行操作,并且没有成功报告。

GMail Google Group上有一个线程建议通过访问https://accounts.google.com/DisplayUnlockCaptcha来解决“无效凭据”错误,如果您正在使用Google Apps,则可以访问https://www.google.com/a/[YOURDOMAIN.COM]/UnlockCaptcha,但后者会提示我的用户名和密码错误,而它们显然不是。使用https://accounts.google.com/DisplayUnlockCaptcha完全正常 - 即使我的帐户是托管的应用程序,而不是普通的GMail - 但是当我尝试使用Google提供的PHP示例代码重新登录时,仍然会收到相同的错误。

我已经尝试过各种托管的Google应用程序帐户和普通的GMail帐户。我尝试将IMAP服务器从imap.gmail.com切换到imap.googlemail.com,但没有任何区别。

      /**
       * Make the IMAP connection and send the auth request
       */
      $imap = new Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', true);
      $authenticateParams = array('XOAUTH', $initClientRequestEncoded);
      $imap->requestAndResponse('AUTHENTICATE', $authenticateParams);

      /**
       * Print the INBOX message count and the subject of all messages
       * in the INBOX
       */
      $storage = new Zend_Mail_Storage_Imap($imap);

      echo '<h1>Total messages: ' . $storage->countMessages() . "</h1>\n";

对于那些有兴趣的人,以下是设置连接的具体PHP代码,所有XOauth都是由Google的PHP在同一文件中处理的,但我跳过了它。


根据Zend文档,您应该执行$imap = new Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', 'SSL');。 http://framework.zend.com/apidoc/1.9/Zend_Mail/Protocol/Zend_Mail_Protocol_Imap.html#__construct - WildlyInaccurate
谢谢,我在盲目地遵循 Google 的示例代码,并且 Zend 类的 docblock 与您的观点一致。不幸的是将其更改为“SSL”没有效果,仍然报同样的错误。 - Phil Sturgeon
你最终解决了这个问题吗?我也卡在同样的地方。我完全按照示例代码操作,但是出现了无效凭据错误。似乎找不到任何人已经修复了它。 - Joe Baker
我从未解决这个问题,因为在发布几周后,该项目就失败了 - 这真是一件烦人的事情。 - Phil Sturgeon
3个回答

4

我曾经遇到过这个完全相同的错误,最终发现我在请求OAuth权限时使用了错误的范围。

您需要使用以下范围...

  • scope=https://mail.google.com/
  • access_type=offline

并且显然需要在您的Gmail帐户中启用IMAP。 现在一切看起来都很好。


感谢您更新这个旧问题并提供答案。我之前没有找到任何人成功地完成过这个,所以知道它是可能的真是太好了。幸运的是,这个项目已经被放弃了,所以我不再关心,但下次有用 :) - Phil Sturgeon

1
你可能遇到的一个问题是Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', true);的第三个参数不应该是true。它应该是一个字符串,可以是"SSL"或"TLS"。我相信如果使用端口993,你想要的是"SSL"。只有当它为FALSE时,它才是布尔值。
尝试用以下代码替换第一行:
$imap = new Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', 'SSL');

嘿,Joel,谢谢你的回答,但是在评论中已经提出了这个问题,但没有效果。当我使用“SSL”而不是“true”时,我得到完全相同的错误。还有其他想法吗? - Phil Sturgeon

1

当我遇到同样的错误信息时,是因为

$options['consumerSecret'] = $THREE_LEGGED_CONSUMER_SECRET_HMAC;

我在一个函数中进行操作,但变量$THREE_LEGGED...不在作用域内。这很愚蠢,我相信你会发现这个问题,但以防有新手在阅读,请注意。


是的,可惜情况并非如此。 - Phil Sturgeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接