SecurityException: Die Anrufer-UID XXXX unterscheidet sich von der UID des Authentifikators


84

Ich habe die obige Ausnahme erhalten, als ich versucht habe, die Sample Sync Adapter-Anwendung zu implementieren. Ich habe zahlreiche Beiträge zu diesem Thema gesehen, aber keine zufriedenstellende Antwort.

Deshalb werde ich meine Lösung hier aufschreiben, falls jemand anderes in das gleiche Problem gerät.


Vielen Dank. Ich bin auf dieses Problem gestoßen und konnte dank Ihres Beitrags die Lösung schneller finden.
Damian

4
Leider ist der gepostete Link in der Zwischenzeit kaputt gegangen. Hat jemand eine Alternative?
johsin18

Antworten:


54

Einige andere nützliche Tipps zum Debuggen solcher Probleme.

Aktivieren Sie zunächst die ausführliche Protokollierung für einige Tags:

$ 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

Sie sehen die Protokollierung folgendermaßen:

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

Dies bedeutet, dass für diesen Kontotyp kein Authentifikator registriert ist. Um zu sehen, welche Authentifikatoren registriert sind, überprüfen Sie das Protokoll bei der Installation des Pakets:

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

Ich hatte das Problem, dass der XML-Deskriptor des Authentifikators auf eine Zeichenfolgenressource verwies, die während der Installation nicht ordnungsgemäß aufgelöst wurde:

android:accountType="@string/account_type"

Die Protokolle zeigten

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

Das Ersetzen durch eine normale Zeichenfolge (keine Ressource) löste das Problem. Dies scheint Android 2.1-spezifisch zu sein.

android:accountType="com.example.account"

Dies hat mir geholfen, das Problem zu lösen.
Skygeek

44

Überprüfen Sie zunächst die in diesem Beitrag erläuterte Bedingung :

[...] Wenn Sie einen Fehler AccountManagerServiceim Formular sehen caller uid XXXX is different than the authenticator's uid, kann dieser etwas irreführend sein. Der 'Authentifikator' in dieser Nachricht ist nicht Ihre Authentifikatorklasse, sondern das, was Android als registrierten Authentifikator für den Kontotyp versteht. Die Überprüfung, die innerhalb der stattfindet, AccountManagerServicesieht folgendermaßen aus:

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

Beachten Sie, dass hasAuthenticatorUid()die account.type. Hier hatte ich es vermasselt. Ich habe meine Accountmit einem Typ erstellt, der durch eine Konstante angegeben wird:

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

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

Diese Konstante stimmte jedoch nicht mit der XML-Definition für meinen Authentifikator überein:

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

Zweitens, wenn Sie wie ich sind und das Beispiel zum Testen in Ihre vorhandene App einbetten möchten, stellen Sie sicher, dass Sie eine ConstantsKlasse verwenden, die Teil dieses Beispiels ist und nicht unter android.provider.SyncStateContractPaket. Weil beide Klassen denselben Attributnamen ACCOUNT_TYPEverwenden, der beim Erstellen eines AccountObjekts verwendet wird.


Vielen Dank! Ihre erste Überprüfung hat das Problem behoben. Und raten Sie mal, in einem neuen Projekt hatte ich alles über die Authentifizierungs-XML-Datei vergessen.!
George Pligoropoulos

7
Ich sehe dieses Problem immer noch, aber nur für einige meiner Benutzer. Ich habe doppelt überprüft, ob der android: accountType in der Datei authentulator.xml mit der Konstante in meinem GenericAccountsService übereinstimmt. Ich weiß auch, dass diese Ausnahme bei der überwiegenden Mehrheit meiner Apps-Benutzer nicht auftritt, aber in meinen Absturzprotokollen wird ab und zu der Absturz für eine Handvoll Benutzer angezeigt. Irgendeine Idee? Kann die Datei authentulator.xml geändert werden, um dies zu verursachen?
schüttelte

3
@clu Konnten Sie Ihr Problem jemals lösen? Ich stehe vor einem identischen Szenario. Dieser Fehler tritt nur bei einer kleinen Minderheit meiner Benutzer auf: hauptsächlich bei HTC One X, HTC One SV und HTC Desire 500 sowie bei einigen anderen Geräten.
Chandsie

1
@chandsie Gleich hier. Nur HTC-Geräte scheinen dieses Problem zu haben. Es funktioniert gut für jedes andere Gerät.
Kiran Kumar

@clu Ich stehe auch vor dem gleichen Problem. Konnten Sie dies lösen oder die Grundursache finden?
Wasaig

25

In meinem Fall war das Problem ganz einfach eine Nichtübereinstimmung in accountType, die res/xml/authenticator.xmlals deklariert wurde , android:accountType="com.foo"aber wie "foo.com"beim Erstellen des Kontos falsch referenziert wurde :

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

Doh!


1
Hallo, in meinem Fall sind accountType in xml und im newAccount-Objekt beide gleich. Trotzdem zeigt es an, dass die Anrufer-UID XXXX sich vom UID-Fehler des Authentifikators unterscheidet. Warum?
Vijay Vankhede

10

Es gibt nur wenige Teile, um ein benutzerdefiniertes Konto zu implementieren ...

Um AccountManager in Ihrer Aktivität aufzurufen, haben Sie so etwas bereits implementiert ...

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

In res / xml / authentulator.xml müssen Sie Ihre AccountAuthenticator-Daten definieren (verantwortlich für Ihre Authenticator-UID). ACCESS_TYPE muss dieselbe Zeichenfolge sein wie Ihr definierter accountType in dieser 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>

Schließlich müssen Sie Ihren Dienst als Ihr Manifest definieren. Bitte vergessen Sie nicht die relevanten Berechtigungen zum Verwalten Ihrer Konten (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>

Achten Sie auf den TYPO! AuthenticaTAtionService. Außerdem ist es anscheinend name = ". AuthenticationService" (mit einem Punkt) und es wird in meinem Fall rot angezeigt, aber es funktioniert trotzdem.
FlorianB

5

Mein Fehler bestand darin, dass die AccountManager-Methode getAccounts () Konten zurückgab, die nur meinem Anwendungskontext zugeordnet waren. Ich habe mich verändert von

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

zu

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

4

Der gleiche Fehler wird angezeigt, wenn Sie in Ihren Absichtsfiltern in Ihrem Manifest falsche Werte einfügen. Ich habe das Android-Dev-Tutorial zu Synchronisationsadaptern durchgearbeitet und am Ende einen falschen Wert für "Intent-Filter / Action Android: Name" sowie "Metadaten / Android: Name" für Syncadapter / Accountauthenticator festgelegt. Dieser Fehler führte dazu, dass dieselben Fehler in den Protokollen angezeigt wurden.

Für den Datensatz lauten die korrekten Werte: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}


2

Stellen Sie sicher, dass Ihr Service-XML auf den richtigen Speicherort verweist.

Zum Beispiel, wenn Ihr Modulname ist

com.example.module.auth

Sie sind Service Android: Name sollte sein

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

in AndriodManifest.xml


2

Schauen Sie sich zunächst Jan Berkels exzellenten Debugging-Rat an.

Schließlich müssen Sie auch überprüfen, ob Ihr Inhaltsanbieter sowie die Authentifizierungs- und Synchronisierungsdienste als untergeordnete applicationElemente des Tags deklariert sind .

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

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

        <service
            ...(Sync service declaration)... 
        </service>
    </application>

Kind von <Anwendung>! Hab es für mich getan, danke! Und es ist <service android: name = ". AuthenticationService">
FlorianB

2

Für mich war es ein sehr dummer Fehler und sehr schwer zu finden.

In authentulator.xml habe ich geschrieben

<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"
/>

anstatt

<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"
/>

was diesen Fehler verursachte. Hoffe das hilft jemandem!


2

In meinem Fall waren es Berechtigungen in der Manifestdatei, die ich hatte

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

Es waren alles Kappen, als ich es änderte

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

Problem war weg


1

Ebenfalls,

Überprüfen Sie, ob Sie den AccountType zu sehr wie einen einfachen alten String behandeln.

Ich habe den größten Teil meines Codes unter com.mycompany.android gepackt

Ich habe den folgenden AccountType mit Erfolg verwendet: com.mycompany.android.ACCOUNT .

Jetzt habe ich den Wunsch, mehrere Konten zu verwenden, und wenn ich versuche, ".SubType" am Ende meines Kontos anzuhängen, schlägt dies mit dem fehl

Die Aufrufer-UID xxxxx unterscheidet sich von der UID des Authentifikators

Wenn ich jedoch "_subType" (Unterstrich anstelle von Punkt) verwende, funktioniert dies einwandfrei.

Ich vermute, dass Android irgendwo unter der Haube versucht, com.mycompany.android.ACCOUNT als legalen Paketnamen zu behandeln, was es mit Sicherheit nicht ist.

Also nochmal:

BAD com.mycompany.android.ACCOUNT.subType

GUT com.mycompany.android.ACCOUNT_subType


1

Wenn Sie diesen Fehler erhalten und alle oben genannten Lösungen für Sie nicht funktionieren. Außerdem gehen Sie davon aus, dass Sie alle Verfahren befolgt haben. Möglicherweise wird der Authentifizierungsdienst von einem anderen Entwickler entwickelt, den Sie zum Hinzufügen von Konten verwenden möchten.

Sie können versuchen, Ihre Anwendung mit einem Release-Keystore zu signieren. Jetzt führen Sie die Anwendung aus. Ich nehme an, das sollte für dich funktionieren.


1

Hier ist eine andere mögliche Lösung.

Ich hatte diesen Fehler, als mein Benutzer in meiner App mit derselben E-Mail-Adresse wie sein Android-Google-Konto registriert wurde.

Als ich versuchte, accountManager.getAccounts()nach dieser E-Mail zu suchen, fand ich ein Konto mit derselben E-Mail, ABER mit einem anderen Kontotyp. Wenn ich versuche, dieses Konto (google.com) zu verwenden, wird dieser Fehler angezeigt.

Der richtige Weg, um ein Konto zu finden, ist:

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

Sie könnten accountManager.getAccountsByType("myservice.com")stattdessen anrufen .
Nickgrim

0

Stellen Sie außerdem sicher, dass Ihr AccountAuthenticatorService über die Filter für Prüferabsichten verfügt.

dh.

<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>


0

Wenn dieselben Apps aus einem anderen Store stammen, z. B. Amazon App Store und Google Play Store, wird möglicherweise eine Sicherheitsausnahme ausgelöst, da die Signatur der Apps in diesem Fall unterschiedlich ist. Wenn Sie geplant hätten, denselben Authentifikator für den Zweck eines einzelnen zu verwenden Melden Sie sich an, eine der Apps würde abstürzen. Ich war einmal auf dieses Problem gestoßen. Insbesondere der Amazon App Store würde seine Apps aus Sicherheitsgründen mit einer eigenen Signatur signieren.

Hinweis: Wenn hier kein Tippfehler oder andere Antworten vorliegen, überprüfen Sie bei einmaliger Anmeldung die Signatur der Apps.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.