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.

Paul
quelle
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"
Jan Berkel
quelle
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.

Paul
quelle
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!

Farrukh Najmi
quelle
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>
DocFoster
quelle
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);
PLA
quelle
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}

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

jrea
quelle
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>
Geoff
quelle
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!

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

Ivan Vazhnov
quelle
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

Darren Hicks
quelle
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.

Ali Ashraf
quelle
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;
}
konmik
quelle
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>
Løkling
quelle
0

Wenn diese Ausnahme bei Samsung-Geräten auftritt, stellen Sie sicher, dass Sie den abgesicherten Modus nicht verwenden .

Rocknow
quelle
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.

JerryWild
quelle
0

Für diejenigen, die noch Erfahrung haben: https://stackoverflow.com/a/37102317/4171098

In meinem Fall habe ich versehentlich AuthenticatorService im Manifest außerhalb der <application>Tags definiert. Durch Verschieben der Deklaration wurde <application>das Problem behoben. Hoffnung wird jemandem helfen.

Mateusz Wlodarczyk
quelle