IMAP "Неверные учетные данные" через GMail XOAUTH - PullRequest
6 голосов
/ 11 ноября 2011

Я пытаюсь подключиться к серверу IMAP с помощью OAuth, используя Пример PHP-кода , предоставленный Google, который использует класс Zend Imap, но мне не удается пройти аутентификацию.Zend сообщает мне об ошибке:

Zend_Mail_Storage_Exception [ Error ]: cannot select INBOX, is this a valid transport?

Раздражающе, но это довольно запутанное сообщение об ошибке, которое, по сути, является "Invalid Credentials".Как я это узнал?Отлаживая фактические команды, отправляемые в сокет IMAP, я вижу следующее:

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

Я пробовал с telnet и гемом Ruby gmail_xoauth , который предполагает, что это не проблема кода, ночто-то еще.

Глядя на самый базовый уровень всего этого, я получаю такие команды:

TAG1 AUTHENTICATE XOAUTH R0VUIGh0dHBzOi8vbWFpbC5nb29nbGUuY29tL21h......etc

Вот где я получаю NO Invalid credentials тогда:

TAG2 SELECT "INBOX"

Это возвращает BAD Unknown command и выгоняет меня.

Я пытался искать людей, имеющих ту же проблему, но я нахожу только вопросы и ответов нет.Есть несколько похожих вопросов StackOverflow:

В одном посте показано, что у кого-то точно такая же проблема в Python.

В этом посте показано, что кто-то пытаетсябыть неловким и делать это с OAuth 2, не сообщая об успехе.

В группе Google GMail есть нить, в которой предлагается исправить ошибку "Invalid Credentials", перейдя в https://accounts.google.com/DisplayUnlockCaptchaдля учетных записей GMail и https://www.google.com/a/[YOURDOMAIN.COM]/UnlockCaptcha, если вы используете Google Apps, но последний только что сказал, что мои имя пользователя и пароль были неправильными, когда они явно не были.Использование этого https://accounts.google.com/DisplayUnlockCaptcha работало нормально - несмотря на то, что моя учетная запись является размещенным приложением, а не просто старым GMail, - однако при попытке войти в систему с помощью примера кода PHP, предоставленного Google, у меня все равно возникают те же ошибки.

Я пробовал использовать разные учетные записи 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 обрабатываются PHP Google в том же файле, но я пропустил его.

Ответы [ 3 ]

4 голосов
/ 12 октября 2012

У меня была точно такая же ошибка, и в конце концов я понял, что использовал неправильную область при запросе разрешений OAuth.

Вам нужно иметь ...

А также, конечно, IMAP включен в вашей учетной записи Gmail. Теперь все выглядит хорошо.

1 голос
/ 09 февраля 2012

Когда у меня было то же самое сообщение об ошибке, это было потому, что

$options['consumerSecret'] = $THREE_LEGGED_CONSUMER_SECRET_HMAC;

Я делал это в функции, а переменная $ THREE_LEGGED ... не была в области видимости.Довольно глупо, и я уверен, что вы заметили это, но на всякий случай, если кто-то новый читает это.

1 голос
/ 11 ноября 2011

Одна из проблем, с которой вы можете столкнуться, заключается в том, что третий параметр Zend_Mail_Protocol_Imap ('imap.googlemail.com', '993', true); не должно быть правдой. Это должна быть строка, такая как «SSL» или «TLS». Я полагаю, что вы хотите «SSL» при переходе через порт 993. Это только логическое значение, когда оно ЛОЖНО.

Попробуйте заменить эту первую строку на:

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