SecurityException: el uid de la persona que llama XXXX es diferente al uid del autenticador

84

Recibí la excepción anterior al intentar implementar la aplicación Sample Sync Adapter. He visto numerosas publicaciones relacionadas con este problema, pero no he recibido una respuesta satisfactoria.

Así que anotaré mi solución aquí en caso de que alguien más tenga el mismo problema.

Paul
fuente
Gracias. Me encontré con este problema y pude encontrar la solución más rápidamente gracias a su publicación.
Damian
4
Desafortunadamente, el enlace publicado se rompió mientras tanto. ¿Alguien tiene una alternativa?
johsin18

Respuestas:

54

Algunos otros consejos útiles para depurar problemas como este.

Primero habilite el registro detallado para algunas etiquetas:

$ 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

Verá un registro como este:

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

Lo que significa que no hay ningún autenticador registrado para este tipo de cuenta. Para ver qué autenticadores están registrados, observe el registro al instalar el paquete:

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

Tuve el problema de que el descriptor xml del autenticador se refería a un recurso de cadena que no se resolvió correctamente durante la instalación:

android:accountType="@string/account_type"

Los registros mostraban

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

Reemplazarlo con una cadena normal (no recurso) resolvió el problema. Esto parece ser específico de Android 2.1.

android:accountType="com.example.account"
Jan Berkel
fuente
Esto me ayudó a acabar con el problema.
skygeek
44

Primero, verifique la condición explicada en esta publicación :

[...] Si ve un error en AccountManagerServiceel formulario caller uid XXXX is different than the authenticator's uid, puede ser un poco engañoso. El 'autenticador' en ese mensaje no es su clase de autenticador, es lo que Android entiende como el autenticador registrado para el tipo de cuenta. El cheque que ocurre dentro del se AccountManagerServiceve así:

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

Tenga en cuenta que hasAuthenticatorUid()toma el account.type. Aquí es donde había metido la pata. Estaba creando mi Accountcon un tipo especificado por una constante:

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

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

pero esta constante no coincide con la definición XML para mi autenticador:

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

En segundo lugar, si es como yo y desea incrustar la muestra en su aplicación existente para probarla, asegúrese de usar la Constantsclase que es parte de este ejemplo y no del android.provider.SyncStateContractpaquete. Porque ambas clases usan el mismo nombre de atributo ACCOUNT_TYPEque se usa al crear el Accountobjeto.

Paul
fuente
¡Gracias! su primer cheque resolvió el problema. ¡Y adivinen qué, en un nuevo proyecto me había olvidado por completo del archivo xml del autenticador!
George Pligoropoulos
7
Sigo viendo este problema, pero solo para algunos de mis usuarios. He verificado dos veces que el android: accountType en el archivo authenticator.xml coincide con la constante en mi GenericAccountsService. También sé que esta excepción no ocurre para la gran mayoría de los usuarios de mis aplicaciones, pero en mis registros de fallas de vez en cuando veo la falla para un puñado de usuarios. ¿Alguna idea? ¿Se puede modificar el archivo authenticator.xml de alguna manera para causar esto?
b.lit
3
@clu ¿Alguna vez pudo resolver su problema? Me enfrento a un escenario idéntico. Este error solo aparece en una pequeña minoría de mis usuarios: principalmente en HTC One X, HTC One SV y HTC Desire 500, así como también en algunos otros dispositivos.
chandsie
1
@chandsie Lo mismo aquí. Solo los dispositivos HTC parecen tener este problema. Funciona bien para cualquier otro dispositivo.
Kiran Kumar
@clu También estoy enfrentando el mismo problema. ¿Pudiste resolver esto o encontrar su causa raíz?
wasaig
25

En mi caso, el problema fue simplemente una falta de coincidencia en accountType declarado res/xml/authenticator.xmlcomo android:accountType="com.foo"pero referenciado incorrectamente como "foo.com"en la creación de la cuenta:

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

Doh!

Farrukh Najmi
fuente
1
Hola, En mi caso accountType en xml y en el objeto newAccount ambos son iguales. Aún así, muestra que el uid de la persona que llama XXXX es diferente al error de uid del autenticador. ¿por qué?
Vijay Vankhede
10

Hay pocas partes para implementar una cuenta personalizada ...

Para invocar AccountManager en su Actividad, algo como eso que ya implementó ...

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

En res / xml / authenticator.xml tienes que definir tus datos de AccountAuthenticator (responsable de tu UID de Authenticator). ACCESS_TYPE tiene que ser la misma cadena que su accountType definido en este 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>

Finalmente tienes que definir tu servicio tu Manifiesto. No olvide los permisos relevantes para administrar sus cuentas (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
fuente
¡Cuidado con el TYPO! AuthenticaTAtionService. Además es en realidad name = ". AuthenticationService" aparentemente, (con un punto) y lo muestra en rojo en mi caso, pero funciona de todos modos.
FlorianB
5

Mi error fue asumir que el método AccountManager getAccounts () devolvió cuentas solo asociadas con el contexto de mi aplicación. Yo cambié de

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

a

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

El mismo error aparecerá si coloca valores incorrectos en sus filtros de intención en su manifiesto. Revisé el tutorial de android-dev sobre adaptadores de sincronización y terminé estableciendo un valor falso para "intent-filter / action android: name" así como "meta-data / android: name" para syncadapter / accountuthenticator. Este error provocó que aparecieran los mismos errores en los registros.

Para el registro, los valores correctos son: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}

clearfix
fuente
2

Asegúrese de que el XML de su servicio apunte a la ubicación correcta.

Por ejemplo, si el nombre de su módulo es

com.example.module.auth

eres servicio android: el nombre debe ser

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

en AndriodManifest.xml

jrea
fuente
2

En primer lugar, eche un vistazo a los excelentes consejos de depuración de Jan Berkel.

Finalmente, otra cosa que debe verificar es que su proveedor de contenido y los servicios de autenticación y sincronización se declaren como hijos de la applicationetiqueta.

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

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

        <service
            ...(Sync service declaration)... 
        </service>
    </application>
Geoff
fuente
Hijo de <application>! ¡Lo hice por mí, gracias! Y es <service android: name = ". AuthenticationService">
FlorianB
2

Para mí fue un error muy tonto y fue muy difícil de encontrar.

En authenticator.xml escribí

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

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

que estaba causando este error. ¡Espero que esto ayude a alguien!

penduDev
fuente
2

En mi caso, tenía permisos en el archivo de manifiesto.

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

estaba todo en mayúsculas, cuando lo cambié a

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

el problema se fue

Ivan Vazhnov
fuente
1

También,

Verifique si está tratando el AccountType demasiado como una Cadena vieja y simple.

Tengo la mayor parte de mi código empaquetado en com.mycompany.android

He estado usando el siguiente tipo de cuenta con éxito: com.mycompany.android.ACCOUNT .

Ahora tengo el deseo de usar varias cuentas, y cuando intento agregar ".subType" al final de mi cuenta, falla con el

El uid de la persona que llama xxxxx es diferente al uid del autenticador

Sin embargo, si utilizo "_subType" (subrayado en lugar de punto), funciona bien.

Supongo que en algún lugar bajo el capó, Android está tratando de tratar com.mycompany.android.ACCOUNT como un nombre de paquete legal, lo que ciertamente no es así.

Entonces, de nuevo:

BAD com.miempresa.android.ACCOUNT.subType

BUENO com.mycompany.android.ACCOUNT_subType

Darren Hicks
fuente
1

Si recibe este error y todas las soluciones anteriores no funcionan para usted. Además, asume que ha seguido todo el procedimiento. Es posible que exista la posibilidad de que el Servicio de autenticación sea desarrollado por algún otro desarrollador, que desee utilizar para Agregar cuentas.

Lo que puede intentar es intentar firmar su aplicación con un almacén de claves de lanzamiento. Ahora ejecuta la aplicación. Supongo que esto debería funcionar para ti.

Ali Ashraf
fuente
1

Aquí hay otra posible solución.

Tuve este error cuando mi usuario se registró en mi aplicación con el mismo correo electrónico que su cuenta de Google en Android.

Entonces, cuando intenté accountManager.getAccounts()buscar este correo electrónico, encontré una cuenta con el mismo correo electrónico, PERO con otro tipo de cuenta. Entonces, cuando intento usar esta cuenta (google.com), aparece este error.

Entonces, la forma correcta de encontrar una cuenta es:

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
fuente
En su lugar, podrías llamar accountManager.getAccountsByType("myservice.com").
nickgrim
0

También asegúrese de que su AccountAuthenticatorService tenga los filtros de intención de prueba;

es decir.

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

Si obtiene esta excepción en dispositivos Samsung, asegúrese de que no está usando el modo seguro .

rocknow
fuente
0

Si las mismas aplicaciones son de una tienda diferente, por ejemplo, la tienda de aplicaciones de Amazon y la tienda de Google Play, eventualmente se lanzará una excepción de seguridad, ya que la firma de las aplicaciones sería diferente en este caso. Si hubiera planeado usar el mismo autenticador para el propósito iniciar sesión, cualquiera de las aplicaciones fallaría. Me había encontrado con este problema una vez. Especialmente, la tienda de aplicaciones de Amazon firmaría sus aplicaciones con su propia firma por motivos de seguridad.

Nota: Si no hay ningún error tipográfico u otras respuestas mencionadas aquí, verifique la firma de las aplicaciones en caso de inicio de sesión único.

JerryWild
fuente
0

Para aquellos que aún tienen experiencia en el tema: https://stackoverflow.com/a/37102317/4171098

En mi caso, accidentalmente definí AuthenticatorService en el manifiesto fuera de las <application>etiquetas. Mover la declaración al interior <application>solucionó el problema. La esperanza ayudará a alguien.

Mateusz Wlodarczyk
fuente