Аутентификация в Twitter с помощью классов Android AccountManager - PullRequest
7 голосов
/ 14 июня 2011

Я занимаюсь разработкой приложения для Android и хочу интегрировать Twitter.

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

Правильно ли мое понимание?

Теперь проверка подлинности с использованием страницы входа в систему Twitter работает нормально.Но как мне войти в систему с помощью диспетчера учетных записей?

Использование AccountsType в качестве «com.twitter.android.auth.login» Я получил токен и секрет токена с помощью диспетчера учетных записей из • com.twitter.android.oauth.token •com.twitter.android.oauth.token.secret

Я использую Twitter4J и аутентифицируюсь с моим CONSUMER_KEY & CONSUMER_SECRET вместе с recvd.жетоны.но аутентификация всегда терпит неудачу.

CONSUMER_KEY & CONSUMER_SECRET - это ключи, которые я получил, когда я зарегистрировал приложение в твиттере ... но я не понимаю, как я могу использовать эти ключи с Официальной аутентификацией приложения Twitter для Android?

Pls.дай мне знать Спасибо

Вот мой код

public class TwitterAuthentication {    
    private static final String TAG = "TwitterAuthentication";
    private static final int MSG_GOT_AUTH_TOKEN = 100;
    private static final int MSG_GOT_AUTH_SECRET = 101;
    private static final int MSG_NO_AUT_TOKEN_RECVD = 102;

    public static Twitter mTwitter = null;
    private Activity mActivity = null;
    private SharedPreferences prefs;
    private MessageHandler handler = new MessageHandler();
    public static boolean bAuthenticationDone = false;



    public TwitterAuthentication(Activity activity){
        mActivity = activity;
        prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
        if (null == mTwitter){
            mTwitter = new TwitterFactory().getInstance();;
            mTwitter.setOAuthConsumer(Constant.CONSUMER_KEY, Constant.CONSUMER_SECRET);
            bAuthenticationDone = false;
        }

    }

    public void LoginTwitter(){
        if (Constants.DEBUG)Log.d(TAG,"LoginTwitter");
        if (bAuthenticationDone){
            TwitterSessionEvents.onLoginSuccess();
        }
        else if (!isSessionValid()){
            AuthTwitter();
        }
        else{

            bAuthenticationDone = true;
            TwitterSessionEvents.onLoginSuccess();
        }       
    }

    public boolean isSessionValid(){
        boolean ret = false;
        if (null != prefs && null != mTwitter){
            String token = prefs.getString(Constant.OAUTH_TOKEN, "");
            String secret = prefs.getString(Constant.OAUTH_TOKEN_SECRET, "");   
            if (null != token && null != secret && token.length()>0 && secret.length()>0){
                AccessToken a = new AccessToken(token,secret);  
                mTwitter.setOAuthAccessToken(a);
                try {
                    mTwitter.getAccountSettings();
                    keys.User_Id = mTwitter.getScreenName();
                    ret = true;
                } catch (TwitterException e) {
                    ret = false;
                }
            }
        }
        return ret;
    }

    public void AuthTwitter(){

        // First check if Account manager has valid token
        // Result of this is send in MSG
        CheckAccManagerForTwitter();

    }


    public Twitter getTwitter(){
        return mTwitter;
    }

    private boolean CheckAccManagerForTwitter(){

        AccountManager am = AccountManager.get(mActivity); 
        Account[] accts = am.getAccountsByType("com.twitter.android.auth.login");
        if(accts.length > 0) {
            Account acct = accts[0];

            am.getAuthToken(acct, "com.twitter.android.oauth.token", null, mActivity, new AccountManagerCallback<Bundle>() {

                @Override
                public void run(AccountManagerFuture<Bundle> arg0) {
                    try {
                        Bundle b = arg0.getResult();
                        String token = b.getString(AccountManager.KEY_AUTHTOKEN);
                        String userName = b.getString(AccountManager.KEY_ACCOUNT_NAME);
                        handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_TOKEN, token));
                    }
                    catch (Exception e) {
                        Log.e(TAG, "EXCEPTION@AUTHTOKEN");
                        handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
                    }
                }}, null); 

            am.getAuthToken(acct, "com.twitter.android.oauth.token.secret", null, mActivity, new AccountManagerCallback<Bundle>() {

                    @Override
                    public void run(AccountManagerFuture<Bundle> arg0) {
                        try {
                            Bundle b = arg0.getResult();
                            String secret = b.getString(AccountManager.KEY_AUTHTOKEN);
                            handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_SECRET,secret));

                            }
                        catch (Exception e) {
                            Log.e(TAG, "EXCEPTION@AUTHTOKEN");
                            handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
                            }
                        }}, null); 
                //
        }
        else{
            // No twitter account found in Account Manager
            Log.e(TAG, "No Twitter account in Account manager");
            handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);

        }

        return true;
        }

    class MessageHandler extends Handler {
        String token = null;
        String secret = null;
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_GOT_AUTH_TOKEN | msg.what ==MSG_GOT_AUTH_SECRET){
                if (msg.what == MSG_GOT_AUTH_TOKEN){        
                    token = (String)msg.obj;
                }
                else if (msg.what == MSG_GOT_AUTH_SECRET){
                    secret = (String)msg.obj;
                }
                if (null != token && null != secret){
                    AccessToken accesstoken = new AccessToken(token,secret);
                    mTwitter.setOAuthAccessToken(accesstoken);
                    try {
                        mTwitter.getAccountSettings();
                        keys.User_Id = mTwitter.getScreenName();                    
                    } catch (Exception e) {
                        // That means Authentication Failed
                        // So fall back to web login 
                        Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
                        mActivity.startActivity(i);                 
                    }
                }

            }
            else if (msg.what == MSG_NO_AUT_TOKEN_RECVD){
                // That means There is no twiter account with Account Manager
                // So fall back to web login 
                Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
                mActivity.startActivity(i);                 
            }
        }
    }



    public void LogoutTwiter(){


    }

}

Ответы [ 2 ]

3 голосов
/ 09 июля 2013

Учетные данные com.twitter.android.oauth.token и com.twitter.android.oauth.token.secret, возвращаемые AccountManager для Android, проходят проверку подлинности только с использованием официального ключа и секретного ключа Twitter.AFAIK. На самом деле они бесполезны для сторонних разработчиков.

Что касается Twitter, я просто скажу, что официальная пара ключ / секретный ключ пользователя "там", и если Twitter изменил их через обновление приложения, онинарушил бы OAuth для каждого пользователя без этого обновления приложения.

1 голос
/ 14 июня 2011

хорошо, вы используете секретный и потребительский ключ, чтобы фактически получить токен. используя учетные записи Android, вы получаете токен от них.

Таким образом, в целом, чтобы сделать твит, например, вам нужен только токен, и, как я уже сказал, вы получаете его либо из аккаунтов, либо из twitter4j. поэтому после того, как вы получите токен из учетных записей, вам нужно установить его в качестве твиттера 4jsdk и регулярно использовать API.

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...