AccountManager semble renvoyer un mauvais authToken
-
13-11-2019 - |
Question
Je travaille sur une application Google Tasks avec la nouvelle API, mais je ne parviens pas à obtenir l'autorisation de travailler.J'utilise Android AccountManager pour obtenir un authToken. Ce qui est étrange, c'est que j'obtiens une erreur indiquant que j'utilise de mauvaises informations d'identification :
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalid",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Mon 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);
}
J'ai essayé d'utiliser un HttpRequestInitializer
et appliquez l'authToken dans un HttpExecuteInterceptor
au lieu d'utiliser le (obsolète) HttpTransport.defaultHeaders
mais ça ne marche pas non plus.
new Tasks(transport, initializer, new GsonFactory());
Qu'est-ce que je fais mal?Mes identifiants sont évidemment corrects, GMail fonctionne bien.
La solution
J'ai trouvé le problème :J'utilisais le authTokenType goanna_mobile
, que j'ai trouvé dans une autre application.Même si AccountManager me demande d'autoriser mon application à accéder à Google Tasks, le type d'authTokenType est incorrect.
Le bon est cl
pour Google Agenda.