AccountManager, похоже, возвращает неправильный authToken - PullRequest
2 голосов
/ 14 мая 2011

Я работаю над приложением Google Tasks с новым API, но не могу заставить авторизацию работать. Я использую Android AccountManager для получения authToken, странно то, что я получаю сообщение об ошибке, указывающее, что я использую неправильные учетные данные:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "invalid",
                "message": "Invalid Credentials",
                "locationType": "header",
                "location": "Authorization"
            }
        ],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

Мой код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    transport = AndroidHttp.newCompatibleTransport();
    transport.defaultHeaders = new GoogleHeaders();

    gotAccount(false);
}

private void authenticated(String authToken) {
    ((GoogleHeaders) transport.defaultHeaders).setGoogleLogin(authToken);
    Tasks service = new Tasks(transport, new GsonFactory());

    try {
        TaskLists taskLists = service.tasklists.list().execute();
    } catch (Exception e) {
        handleException(e);
    }

}

private void gotAccount(final AccountManager manager, final Account account) {
    new Thread() {

        @Override
        public void run() {
            try {
                final Bundle bundle = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true,
                        null, null).getResult();
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        if (bundle.containsKey(AccountManager.KEY_INTENT)) {
                            Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
                            int flags = intent.getFlags();
                            flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
                            intent.setFlags(flags);
                            startActivityForResult(intent, REQUEST_AUTHENTICATE);
                        } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
                            authenticated(bundle.getString(AccountManager.KEY_AUTHTOKEN));
                        }
                    }

                });
            } catch (Exception e) {
                handleException(e);
            }
        };
    }.start();
}

private void gotAccount(boolean tokenExpired) {
    AccountManager manager = AccountManager.get(this);
    Account account = manager.getAccountsByType("com.google")[0];
    if (tokenExpired) {
        manager.invalidateAuthToken("com.google", mAuthToken);
    }
    gotAccount(manager, account);
}

Я пытался использовать HttpRequestInitializer и применять authToken в HttpExecuteInterceptor вместо использования (не рекомендуется) HttpTransport.defaultHeaders, но это тоже не работает.

new Tasks(transport, initializer, new GsonFactory());

Что я делаю не так? Мои учетные данные, очевидно, правильные, GMail работает нормально.

1 Ответ

2 голосов
/ 15 мая 2011

Я обнаружил проблему: я использовал authTokenType goanna_mobile, который я нашел в другом приложении.Несмотря на то, что AccountManager запрашивает у моего приложения доступ к Google Tasks, это неверный тип authTokenType.

Для Google Calendar правильный cl.

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