SecurityException: l’uid XXXX de l’appelant est différent de celui de l’authentificateur

J’ai reçu l’exception ci-dessus en essayant d’implémenter l’application Sample Sync Adapter. J’ai vu de nombreux articles liés à ce problème mais aucune réponse satisfaisante.

Je vais donc noter ma solution ici si quelqu’un d’autre aborde le même problème.

Quelques autres conseils utiles pour déboguer des problèmes comme celui-ci.

Activez d’abord la journalisation détaillée pour certaines balises:

$ adb shell setprop log.tag.AccountManagerService VERBOSE $ adb shell setprop log.tag.Accounts VERBOSE $ adb shell setprop log.tag.Account VERBOSE $ adb shell setprop log.tag.PackageManager VERBOSE 

Vous verrez apparaître comme ceci:

 V/AccountManagerService: initiating bind to authenticator type com.example.account V/Accounts: there is no service connection for com.example.account V/Accounts: there is no authenticator for com.example.account, bailing out D/AccountManagerService: bind attempt failed for Session: expectLaunch true, connected false, stats (0/0/0), lifetime 0.002, addAccount, accountType com.example.account, requiredFeatures null 

Ce qui signifie qu’il n’y a pas d’authentificateur enregistré pour ce type de compte. Pour voir quels authentificateurs sont enregistrés, regardez le journal lors de l’installation du paquet:

 D/PackageManager: encountered new type: ServiceInfo: AuthenticatorDescription {type=com.example.account}, ComponentInfo{com.example/com.example.android.AuthenticatorService}, uid 10028 D/PackageManager: notifyListener: AuthenticatorDescription {type=com.example.account} is added 

J’ai eu le problème que le descripteur XML de l’authentifiant se référait à une ressource de chaîne qui n’a pas été résolue correctement lors de l’installation:

 android:accountType="@ssortingng/account_type" 

Les journaux ont montré

 encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ... 

Le remplacer par une chaîne normale (pas une ressource) a résolu le problème. Ceci semble être spécifique à Android 2.1.

 android:accountType="com.example.account" 

Tout d’abord, vérifiez la condition expliquée sur ce post :

[…] Si vous voyez une erreur de la part de AccountManagerService de l’ caller uid XXXX is different than the authenticator's uid du formulaire, caller uid XXXX is different than the authenticator's uid , cela peut être un peu trompeur. L’authentificateur dans ce message n’est pas votre classe d’authentification, mais c’est ce qu’Android comprend comme étant l’authentificateur enregistré pour le type de compte. La vérification qui se produit dans le AccountManagerService ressemble à ceci:

  private void checkCallingUidAgainstAuthenticator(Account account) { final int uid = Binder.getCallingUid(); if (account == null || !hasAuthenticatorUid(account.type, uid)) { Ssortingng msg = "caller uid " + uid + " is different than the authenticator's uid"; Log.w(TAG, msg); throw new SecurityException(msg); } if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "caller uid " + uid + " is the same as the authenticator's uid"); } } 

Notez que hasAuthenticatorUid() prend le type de account.type . C’est là que j’ai foiré. Je créais mon Account avec un type spécifié par une constante:

  class LoginTask { Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE); ... } class AuthenticatorService extends Service { public static final Ssortingng ACCOUNT_TYPE = "com.joelapenna.foursquared"; ... } 

mais cette constante ne correspondait pas à la définition XML de mon authentificateur:

   

Deuxièmement, si vous êtes comme moi et souhaitez intégrer l’exemple dans votre application existante pour le tester, assurez-vous d’utiliser la classe Constants qui fait partie de cet exemple et non le package android.provider.SyncStateContract . Parce que les deux classes utilisent le même nom d’atsortingbut ACCOUNT_TYPE que celui utilisé lors de la création de l’object Account .

Dans mon cas, le problème était tout simplement une incohérence dans accountType déclaré dans res/xml/authenticator.xml comme android:accountType="com.foo" mais référencé incorrectement comme "foo.com" lors de la création du compte:

 Account newAccount = new Account("dummyaccount", "foo.com"); 

Doh!

Il y a peu de pièces pour implémenter un compte personnalisé …

Pour appeler AccountManager dans votre activité, quelque chose comme celui que vous avez déjà implémenté …

 Account account = new Account(username, ACCESS_TYPE); AccountManager am = AccountManager.get(this); Bundle userdata = new Bundle(); userdata.putSsortingng("SERVER", "extra"); if (am.addAccountExplicitly(account, password, userdata)) { Bundle result = new Bundle(); result.putSsortingng(AccountManager.KEY_ACCOUNT_NAME, username); result.putSsortingng(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE); setAccountAuthenticatorResult(result); } 

Dans res / xml / authenticator.xml, vous devez définir vos données AccountAuthenticator (responsables de votre UID Authenticator). ACCESS_TYPE doit être la même chaîne que votre accountType défini dans ce fichier XML!

   

Enfin, vous devez définir votre service votre manifeste. N’oubliez pas les permissions nécessaires pour gérer vos comptes (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)

       

Mon erreur était de supposer que la méthode getManager () de AccountManager renvoyait des comptes uniquement associés à mon contexte d’application. J’ai changé de

 AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccounts(); 

à

 AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE); 

La même erreur apparaîtra si vous mettez des valeurs incorrectes dans vos filtres d’intention dans votre manifeste. J’ai parcouru le tutoriel sur Android-dev sur les adaptateurs de synchronisation et j’ai fini par définir une valeur erronée pour “intent-filter / action android: name” ainsi que “meta-data / android: name” pour syncadapter / accountauthenticator. Cette erreur a provoqué l’apparition des mêmes erreurs dans les journaux.

Pour l’enregistrement, les valeurs correctes sont les suivantes: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}

Assurez-vous que votre service XML pointe vers le bon emplacement.

Par exemple, si votre nom de module est

com.example.module.auth

vous êtes android de service: le nom devrait être

  

dans AndriodManifest.xml

Tout d’abord, jetez un coup d’œil aux excellents conseils de débogage de Jan Berkel.

Enfin, une autre chose à vérifier est que votre fournisseur de contenu et les services d’authentification et de synchronisation sont déclarés comme enfants de la balise d’ application .

        

Pour moi, c’était une erreur très stupide et très difficile à trouver.

Dans authenticator.xml j’ai écrit

  xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.myapp" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@ssortingng/app_name" /> 

au lieu de

  

qui causait cette erreur. J’espère que cela aide quelqu’un!

Dans mon cas, il s’agissait d’permissions dans un fichier manifeste que j’avais

  

c’était tous les chapeaux, quand je l’ai changé pour

  

le problème avait disparu

Aussi,

Vérifiez si vous traitez trop le type de compte comme un ancien type de chaîne.

J’ai la plupart de mon code emballé sous com.mycompany.android

J’ai utilisé le type de compte suivant avec succès: com.mycompany.android.ACCOUNT .

Maintenant, je souhaite utiliser plusieurs comptes, et lorsque je tente d’append “.subType” à la fin de mon compte, cela échoue avec

l’appelant ux xxxxx est différent de l’identifiant de l’authentificateur

Cependant, si j’utilise “_subType” (trait de soulignement au lieu de point), cela fonctionne bien.

Je suppose que, quelque part sous Android, Android tente de traiter com.mycompany.android.ACCOUNT comme un nom de package légal, ce qui n’est certainement pas le cas.

Donc encore:

BAD com.mycompany.android.ACCOUNT.subType

GOOD com.mycompany.android.ACCOUNT_subType

Si vous obtenez cette erreur et que toutes les solutions ci-dessus ne fonctionnent pas pour vous. En outre, vous supposez que vous avez suivi toutes les procédures. Il se peut que le service d’authentification soit développé par un autre développeur que vous souhaitez utiliser pour append des comptes.

Vous pouvez essayer de signer votre application avec un fichier de clés de version. Maintenant vous exécutez l’application. Je suppose que cela devrait fonctionner pour vous.

Voici une autre solution possible.

J’ai eu cette erreur lorsque mon utilisateur a été enregistré dans mon application avec le même e-mail que son compte Google Android.

Donc, quand j’ai essayé accountManager.getAccounts() et que j’ai cherché cet e-mail, j’ai trouvé un compte avec le même e-mail MAIS avec un autre type de compte. Donc, en essayant d’utiliser ce compte (google.com), j’obtiens cette erreur.

Donc, la bonne façon de trouver un compte est la suivante:

 public Account findAccount(Ssortingng accountName) { for (Account account : accountManager.getAccounts()) if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com")) return account; return null; } 

Assurez-vous également que votre compte AccountAuthenticatorService possède les filtres d’intention du prouveur;

c’est à dire.

       

Si vous obtenez cette exception sur les appareils Samsung, assurez-vous que vous n’utilisez pas le mode sans échec .

Si les mêmes applications proviennent d’un magasin différent, par exemple amazon app store et google play store, une exception de sécurité sera éventuellement émise, car la signature des applications serait différente dans ce cas. Si vous aviez prévu d’utiliser le même authentificateur connectez-vous, l’une ou l’autre de l’application tomberait en panne. J’avais rencontré ce problème une fois. En particulier, amazon app store signerait ses applications avec sa propre signature à des fins de sécurité.

Remarque: S’il n’y a pas d’erreur de faute de frappe ou d’autres réponses mentionnées ici, veuillez vérifier la signature des applications en cas de connexion unique.

Pour ceux qui éprouvent encore des difficultés: https://stackoverflow.com/a/37102317/4171098

Dans mon cas, j’ai défini accidentellement AuthenticatorService dans le manifeste en dehors des balises . Déplacer la déclaration dans résolu le problème. L’espoir aidera quelqu’un.