通过GMail XOAUTH IMAP“无效凭据”

时间:2011-11-11 11:39:50

标签: zend-framework authentication gmail imap gmail-imap

我正在尝试使用OA提供的IMAP服务器,使用Google提供的PHP Sample Code使用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

这是我得到NO Invalid credentials的地方:

TAG2 SELECT "INBOX"

这会返回BAD Unknown command并将我踢出去。

我一直在寻找有同样问题的人,但我发现只有问题,没有答案。有一些类似的StackOverflow问题:

One post显示有人在Python中遇到完全相同的问题。

This post显示有人试图尴尬并使用OAuth 2进行操作,但没有成功报告。

GMail Google Group上有一个帖子表明,如果您使用的是Google Apps,则可以通过转至https://accounts.google.com/DisplayUnlockCaptcha获取GMail帐户和https://www.google.com/a/[YOURDOMAIN.COM]/UnlockCaptcha来解决“无效凭据”错误,但后者只是说我的用户名和密码错误,但他们显然没有。使用此https://accounts.google.com/DisplayUnlockCaptcha工作正常 - 即使我的帐户是托管应用程序,而不是普通的GMail - 但是当我尝试使用Google提供的PHP示例代码重新登录时,我仍然会遇到相同的错误。

我尝试过各种托管的Google App帐户和一个简单的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在同一个文件中处理,但我跳过它。

3 个答案:

答案 0 :(得分:4)

我遇到了同样的错误,最终意识到我在请求OAuth权限时使用了错误的范围。

你需要......

  • 范围= HTTPS://mail.google.com/
  • ACCESS_TYPE =离线

此外,您的Gmail帐户中也启用了IMAP。一切似乎都很好。

答案 1 :(得分:1)

您可能遇到的一个问题是Zend_Mail_Protocol_Imap的第三个参数('imap.googlemail.com','993',true);不应该是真的。它应该是一个字符串,如“SSL”或“TLS”。如果超过端口993,我相信你想要“SSL”。当它为FALSE时它只是一个布尔值。

尝试用这个替换第一行:

$imap = new Zend_Mail_Protocol_Imap('imap.googlemail.com', '993', 'SSL');

答案 2 :(得分:1)

当我有同样的错误信息时,那是因为

$options['consumerSecret'] = $THREE_LEGGED_CONSUMER_SECRET_HMAC;

我在一个函数和变量$ THREE_LEGGED中这样做...不在范围内。非常愚蠢,我确信你已经发现了这一点,但以防万一新人正在阅读。