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

84

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 au cas où quelqu'un d'autre aurait le même problème.

Paul
la source
Merci. J'ai rencontré ce problème et j'ai pu trouver la solution plus rapidement grâce à votre message.
Damian
4
Malheureusement, le lien publié a été interrompu entre-temps. Quelqu'un a-t-il une alternative?
johsin18

Réponses:

54

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

Commencez par activer 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 une journalisation comme celle-ci:

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'aucun authentificateur n'est enregistré pour ce type de compte. Pour voir quels authentificateurs sont enregistrés, regardez le journal lors de l'installation du package:

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 d'authentificateur faisait référence à une ressource de chaîne qui n'a pas été résolue correctement lors de l'installation:

android:accountType="@string/account_type"

Les journaux ont montré

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

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

android:accountType="com.example.account"
Jan Berkel
la source
Cela m'a aidé à résoudre le problème.
skygeek
44

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

[...] Si vous voyez une erreur dans AccountManagerServicele 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'authentificateur, c'est ce qu'Android comprend comme étant l'authentificateur enregistré pour le type de compte. Le contrôle qui se produit dans le AccountManagerServiceressemble à ceci:

 private void checkCallingUidAgainstAuthenticator(Account account) {
     final int uid = Binder.getCallingUid();
     if (account == null || !hasAuthenticatorUid(account.type, uid)) {
         String 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 account.type. C'est là que j'avais merdé. Je créais mon Accountavec un type spécifié par une constante:

 class LoginTask {
     Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE);
     ...
 }

 class AuthenticatorService extends Service {
     public static final String ACCOUNT_TYPE = "com.joelapenna.foursquared";
     ...
 }

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

 <account-authenticator xmlns:android="/web/20150729061818/http://schemas.android.com/apk/res/android"
        android:accountType="com.joelapenna.foursquared.account" ... />

Deuxièmement, si vous êtes comme moi et que vous souhaitez intégrer l'exemple dans votre application existante à des fins de test, assurez-vous d'utiliser la Constantsclasse qui fait partie de cet exemple et non du android.provider.SyncStateContractpackage. Parce que les deux classes utilisent le même nom d'attribut ACCOUNT_TYPEque celui utilisé lors de la création d'un Accountobjet.

Paul
la source
Merci! votre première vérification a résolu le problème. Et devinez quoi, dans un nouveau projet, j'avais tout oublié du fichier xml d'authentification.!
George Pligoropoulos
7
Je vois toujours ce problème, mais uniquement pour certains de mes utilisateurs. J'ai vérifié deux fois que le android: accountType dans le fichier authentication.xml correspond à la constante dans mon GenericAccountsService. Je sais aussi que cette exception ne se produit pas pour la grande majorité de mes utilisateurs d'applications, mais dans mes journaux de plantage de temps en temps, je vois le plantage pour une poignée d'utilisateurs. Une idée? Le fichier authentication.xml peut-il être modifié d'une manière ou d'une autre pour provoquer cela?
3
@clu Avez-vous déjà pu résoudre votre problème? Je suis confronté à un scénario identique. Cette erreur n'apparaît que pour une petite minorité de mes utilisateurs: principalement sur HTC One X, HTC One SV et HTC Desire 500, ainsi que sur de nombreux autres appareils.
chandsie
1
@chandsie Même chose ici. Seuls les appareils HTC semblent avoir ce problème. Cela fonctionne bien pour tous les autres appareils.
Kiran Kumar
@clu Je suis également confronté au même problème. Avez-vous pu résoudre ce problème ou en trouver la cause?
wasaig
25

Dans mon cas , le problème était tout simplement un décalage dans accountType déclaré en res/xml/authenticator.xmltant android:accountType="com.foo"mais fait référence à tort comme "foo.com"dans la création du compte:

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

Doh!

Farrukh Najmi
la source
1
Salut, Dans mon cas, accountType en xml et en objet newAccount sont les mêmes. Pourtant, il montre que l'uid de l'appelant XXXX est différent de l'erreur d'uid de l'authentificateur. Pourquoi?
Vijay Vankhede
10

Il y a quelques parties 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.putString("SERVER", "extra");

if (am.addAccountExplicitly(account, password, userdata)) {
    Bundle result = new Bundle();
    result.putString(AccountManager.KEY_ACCOUNT_NAME, username);
    result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE);
    setAccountAuthenticatorResult(result);
}

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

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="de.buecherkiste"
    android:icon="@drawable/buecher"
    android:label="@string/app_name"
    android:smallIcon="@drawable/buecher" >
</account-authenticator>

Enfin, vous devez définir votre service votre manifeste. N'oubliez pas les autorisations appropriées pour gérer vos comptes (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)

<service android:name=".AuthenticationService">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>
DocFoster
la source
Attention au TYPO! AuthenticaTAtionService. De plus, c'est en fait name = ". AuthenticationService" apparemment (avec un point) et il le montre en rouge dans mon cas, mais ça marche quand même.
FlorianB
5

Mon erreur supposait que la méthode AccountManager getAccounts () 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);
PLA
la source
4

La même erreur apparaîtra si vous mettez des valeurs incorrectes dans vos filtres d'intention dans votre manifeste. J'ai parcouru le didacticiel android-dev sur les adaptateurs de synchronisation et j'ai fini par définir une valeur fausse pour "intent-filter / action android: name" ainsi que "meta-data / android: name" pour syncadapter / accountauthenticator. Cette erreur a fait apparaître les mêmes erreurs dans les journaux.

Pour mémoire, les valeurs correctes sont: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}

clearfix
la source
2

Assurez-vous que votre service XML pointe vers l'emplacement correct.

Par exemple, si le nom de votre module est

com.example.module.auth

vous êtes un service android: le nom doit être

<service android:name=".module.auth.name-of-authenticator-service-class"...

dans AndriodManifest.xml

jrea
la source
2

Tout d'abord, jetez un autre 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 en tant qu'enfants de la applicationbalise.

    <application
        ...>
        <activity
            ...(Activity)...
        </activity>
        <provider
            ...(CP service declaration)/>

        <service
            ...(Authentication service declaration)...
        </service>

        <service
            ...(Sync service declaration)... 
        </service>
    </application>
Geoff
la source
Enfant de <application>! Je l'ai fait pour moi, merci! Et c'est <service android: name = ". AuthenticationService">
FlorianB
2

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

Dans Authenticator.xml j'ai écrit

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android">
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="@string/app_name"
/>

au lieu de

<account-authenticator
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="@string/app_name"
/>

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

penduDev
la source
2

Dans mon cas, c'était les autorisations dans le fichier manifeste que j'avais

<uses-permission android:name="ANDROID.PERMISSION.GET_ACCOUNTS"/>

c'était tout en majuscules, quand je l'ai changé en

<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

le problème était parti

Ivan Vazhnov
la source
1

Aussi,

Vérifiez si vous traitez trop le AccountType comme une chaîne à l'ancienne.

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

J'ai utilisé avec succès le AccountType suivant : com.mycompany.android.ACCOUNT .

Maintenant, j'ai le désir d'utiliser plusieurs comptes, et lorsque j'essaie d'ajouter ".subType" à la fin de mon compte, cela échoue avec le

l'uid de l'appelant xxxxx est différent de l'uid de l'authentificateur

Cependant, si j'utilise "_subType" (trait de soulignement au lieu de point), cela fonctionne très bien.

Je suppose que quelque part sous le capot, Android essaie 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

Darren Hicks
la source
1

Si vous obtenez cette erreur et que toutes les solutions ci-dessus ne fonctionnent pas pour vous. De plus, vous supposez que vous avez suivi toute la procédure. Il se peut que le service d'authentification soit développé par un autre développeur, que vous souhaitez utiliser pour ajouter 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.

Ali Ashraf
la source
1

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.

Ainsi, lorsque j'ai essayé de accountManager.getAccounts()rechercher cet e-mail, j'ai trouvé un compte avec le même e-mail MAIS avec un autre type de compte. Donc, lorsque j'essaye d'utiliser ce compte (google.com), j'obtiens cette erreur.

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

public Account findAccount(String accountName) {
    for (Account account : accountManager.getAccounts())
        if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com"))
            return account;
    return null;
}
Konmik
la source
Vous pouvez appeler à la accountManager.getAccountsByType("myservice.com")place.
nickgrim
0

Assurez-vous également que votre AccountAuthenticatorService dispose des filtres d'intention du prouveur;

c'est à dire.

<service android:name=".service.AccountAuthenticatorService">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data android:name="android.accounts.AccountAuthenticator"
                    android:resource="@xml/authenticator" />
 </service>
Løkling
la source
0

Si les mêmes applications proviennent de magasins différents, par exemple Amazon App Store et Google Play Store, une exception de sécurité sera éventuellement lancée car la signature des applications serait différente dans ce cas.Si vous aviez prévu d'utiliser le même authentificateur à des fins uniques connectez-vous, l'une ou l'autre des applications planterait. j'avais rencontré ce problème une fois. Surtout 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 frappe ou d'autres réponses mentionnées ici, veuillez vérifier la signature des applications en cas de connexion unique.

JerryWild
la source
0

Pour ceux qui ont encore des problèmes: https://stackoverflow.com/a/37102317/4171098

Dans mon cas, j'ai accidentellement défini AuthenticatorService dans le manifeste en dehors des <application>balises. Le déplacement de la déclaration à l'intérieur a <application>résolu le problème. L'espoir aidera quelqu'un.

Mateusz Wlodarczyk
la source