Аутентификация IMAP / SMTP с токеном AccountManager

Я пытаюсь реализовать простой клиент Gmail IMAP / SMTP, используя токен, полученный от AccountManager Android, вместо использования имени пользователя и пароля. Я пытаюсь использовать "mail" в качестве параметра authTokenType для getAuthToken ().

Google предоставляет этот пример SMTP / IMAP с oauth2 http://code.google.com/p/google-mail-oauth2-tools/source/browse/#svn%2Ftrunk%2Fjava%2Fcom%2Fgoogle%.2Fcode%2Fsamples%2Foauth2 http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode

но это для java. Используя его в моем проекте Android, отсутствует некоторый импорт (о SASL). Для их решения я использую эту библиотеку http://code.google.com/p/asmack/

Пример компилируется, но я замечаю проблему во время выполнения

10-04 10:05:44.715: I/System.out(1226): DEBUG: setDebug: JavaMail version 1.4.1
10-04 10:05:44.750: I/System.out(1226): DEBUG: mail.imap.fetchsize: 16384
10-04 10:05:44.750: I/System.out(1226): DEBUG: enable SASL
10-04 10:05:44.750: I/System.out(1226): DEBUG: SASL mechanisms allowed: XOAUTH2
10-04 10:05:46.137: I/System.out(1226): * OK Gimap ready for requests from 84.221.66.29 o42if871216eef.60
10-04 10:05:46.137: I/System.out(1226): A0 CAPABILITY
10-04 10:05:46.805: I/System.out(1226): * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH AUTH=XOAUTH2
10-04 10:05:46.805: I/System.out(1226): A0 OK Thats all she wrote! o42if871216eef.60
10-04 10:05:46.805: I/System.out(1226): IMAP DEBUG: AUTH: XOAUTH
10-04 10:05:46.805: I/System.out(1226): IMAP DEBUG: AUTH: XOAUTH2
10-04 10:05:46.813: I/System.out(1226): DEBUG: protocolConnect login, host=imap.gmail.com, [email protected], password=<non-null>
10-04 10:05:46.813: I/dalvikvm(1226): Could not find method javax.security.sasl.Sasl.createSaslClient, referenced from method com.sun.mail.imap.protocol.IMAPSaslAuthenticator.authenticate
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to resolve static method 44358: Ljavax/security/sasl/Sasl;.createSaslClient ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljavax/security/auth/callback/CallbackHandler;)Ljavax/security/sasl/SaslClient;
10-04 10:05:46.813: D/dalvikvm(1226): VFY: replacing opcode 0x77 at 0x0050
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to resolve exception class 5975 (Ljavax/security/sasl/SaslException;)
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to find exception handler at addr 0x83
10-04 10:05:46.844: W/dalvikvm(1226): VFY:  rejected Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator;.authenticate ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
10-04 10:05:46.844: W/dalvikvm(1226): VFY:  rejecting opcode 0x0d at 0x0083
10-04 10:05:46.844: W/dalvikvm(1226): VFY:  rejected Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator;.authenticate ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
10-04 10:05:46.844: W/dalvikvm(1226): Verifier rejected class Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator;
10-04 10:05:46.844: I/System.out(1226): IMAP DEBUG: Can't load SASL authenticator: java.lang.ClassNotFoundException: com.sun.mail.imap.protocol.IMAPSaslAuthenticator
10-04 10:05:46.844: I/System.out(1226): A1 LOGIN [email protected] anonymous
10-04 10:05:48.137: I/System.out(1226): A1 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)
10-04 10:05:48.164: W/System.err(1226): javax.mail.AuthenticationFailedException: [AUTHENTICATIONFAILED] Invalid credentials (Failure)
10-04 10:05:48.176: W/System.err(1226):         at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:566)
10-04 10:05:48.176: W/System.err(1226):         at javax.mail.Service.connect(Service.java:288)
10-04 10:05:48.176: W/System.err(1226):         at xxx.xxx.xxx.OAuth2Authenticator.connectToImap(OAuth2Authenticator.java:111)
10-04 10:05:48.180: W/System.err(1226):         at xxx.xxx.xxx.OAuth2Authenticator.initialize(OAuth2Authenticator.java:60)
10-04 10:05:48.180: W/System.err(1226):         at xxx.xxx.xxx.TR_Incoming.onTimeout(TR_Incoming.java:106)
10-04 10:05:48.180: W/System.err(1226):         at xxx.xxx.xxx.AlarmThread$1.handleMessage(AlarmThread.java:80)
10-04 10:05:48.180: W/System.err(1226):         at android.os.Handler.dispatchMessage(Handler.java:99)
10-04 10:05:48.180: W/System.err(1226):         at android.os.Looper.loop(Looper.java:137)
10-04 10:05:48.180: W/System.err(1226):         at xxx.xxx.xxx.AlarmThread.run(AlarmThread.java:94)

похоже, что asmack использует org.apache.harmony.javax.security. * вместо javax.security. *

Кто-нибудь сталкивался с этой проблемой? Google, похоже, не рассматривает эту возможность в своем примере, но я думаю, что это должна быть общая функция для пользователя.

Спасибо.


person Lorenzo Braghetto    schedule 09.01.2013    source источник
comment
Проблема возникает из-за того, что com.sun.mail.imap.protocol.IMAPSaslAuthenticator ссылается на javax.security.sasl классы, которые отсутствуют. Возможно, вам следует получить исходники javamail, например, отсюда и измените импорт классов IMAPSaslAuthenticator на org.apache.harmony.javax.security.sasl, доступных в _ 5_, как уже было отмечено.   -  person Stan    schedule 24.03.2013


Ответы (2)


Чтобы использовать ASMACK Authenticator с JavaMail, я создал исправленную версию библиотеки, доступную здесь: http://www.mannaz.at/codebase/imap-ssl-mail-android/

Он основан на http://code.google.com/p/javamail-android/, но поддерживает аутентификатор ASMACK SASSL.

Этот класс отсутствует в файле JAR. Просто добавьте это в свой исходный код:

package com.falott.ingresss.util;
public class Log {
    public static boolean loggingEnabled(){
       return false;
    }
}
person whlk    schedule 09.02.2013
comment
Привет, я выполнил инструкции на вашей стороне, но получаю эту ошибку при звонке connectToImap: 08-24 22:22:51.967: W/dalvikvm(31957): VFY: unable to resolve static method 4410: Lcom/falott/ingresss/util/Log;.loggingEnabled ()Z 08-24 22:22:51.967: W/dalvikvm(31957): VFY: unable to resolve static method 4410: Lcom/falott/ingresss/util/Log;.loggingEnabled ()Z Есть идеи? - person Eugene S; 25.08.2013
comment
Да, я забыл удалить эту ссылку. Просто создайте статический фиктивный метод в классе этого пакета, и все будет в порядке. - person whlk; 02.09.2013
comment
Привет, я хотел бы пересобрать исправленную версию с использованием самой последней версии java mail (для исправления некоторых ошибок GMail / IMAP). Не могли бы вы сообщить мне (нам), как это сделать? - person Pascal; 13.12.2013
comment
Манназ, не могли бы вы связаться со мной? Я хотел бы добиться того же, что и вы, с аутентификатором ASMACK, но с самой последней версией Java Mail. Заранее спасибо - person Pascal; 01.01.2014

Судя по журналу, вы перепутали файлы java6 и java7. Можете ли вы поделиться своими деталями пути к классам.

Другая возможность заключается в том, что у вас нет правильных учетных данных, либо логин, либо pwd неверны.

Я пробовал то, что у вас есть, и это сработало, должно быть прямо.

person Siddharth    schedule 03.02.2013
comment
Здесь мы говорим о системе Android. - person whlk; 03.02.2013
comment
Возможно ли, что он взял неправильные почтовые jar-файлы и включил их в проект? Класс, который не удалось найти, есть только в java7. Также пример, на который он смотрит, скорее всего, не является рабочим примером Android. Это рабочий пример Java. Я подозреваю .. - person Siddharth; 03.02.2013