开发者

AccountManager seems to return wrong authToken

开发者 https://www.devze.com 2023-03-06 03:07 出处:网络
I\'m working on a Google Tasks App with the new API, but I can\'t get the authorization to work. I\'m using the Android AccountManager to get an authToken, the weird thing is I\'m getting an error sta

I'm working on a Google Tasks App with the new API, but I can't get the authorization to work. I'm using the Android AccountManager to get an authToken, the weird thing is I'm getting an error stating I'm using wrong credentials:

{
    "error": {
        "errors": [
            {
                "domain开发者_如何转开发": "global",
                "reason": "invalid",
                "message": "Invalid Credentials",
                "locationType": "header",
                "location": "Authorization"
            }
        ],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

My code:

@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);
}

I've tried to use a HttpRequestInitializer and apply the authToken in a HttpExecuteInterceptor instead of using the (deprecated) HttpTransport.defaultHeaders but that doesn't work either.

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

What am I doing wrong? My credentials are obviously correct, GMail is working fine.


I found the problem: I was using the authTokenType goanna_mobile, which I found in another app. Even though the AccountManager asks me to allow my app to access Google Tasks, it is the wrong authTokenType.

The correct one is cl for Google Calendar.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号