SecurityException: caller uid XXXX प्रामाणिकता के यूआईडी से अलग है


84

नमूना सिंक एडॉप्टर एप्लिकेशन को लागू करने का प्रयास करते समय मुझे उपरोक्त अपवाद प्राप्त हुआ। मैंने इस मुद्दे से संबंधित कई पोस्ट देखे हैं लेकिन कोई संतोषजनक प्रतिक्रिया नहीं मिली है।

इसलिए मैं अपने समाधान को नीचे लिख दूंगा जब कोई और उसी मुद्दे पर पहुंच जाएगा।


धन्यवाद। मैं इस समस्या में भाग गया और आपकी पोस्ट के लिए धन्यवाद जल्दी से समाधान खोजने में सक्षम था।
— डेमियन

4
दुर्भाग्य से, पोस्ट लिंक इस बीच टूट गया। क्या किसी के पास कोई विकल्प है?
— johsin18

जवाबों:


54

इस तरह की समस्याओं को दूर करने के लिए कुछ अन्य उपयोगी टिप्स।

पहले कुछ टैग्स के लिए वर्बोज़ लॉगिंग सक्षम करें:

$ 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

आप इस तरह लॉगिंग देखेंगे:

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

जिसका अर्थ है कि इस खाता प्रकार के लिए कोई प्रमाणिक पंजीकृत नहीं है। यह देखने के लिए कि कौन से प्रमाणक पंजीकृत हैं पैकेज को स्थापित करते समय लॉग देखें:

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

मुझे समस्या थी कि प्रमाणक xml विवरणक एक स्ट्रिंग संसाधन को संदर्भित करता है जो स्थापना के दौरान ठीक से हल नहीं हुआ:

android:accountType="@string/account_type"

लॉग दिखाया

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

इसे सामान्य स्ट्रिंग (संसाधन नहीं) के साथ प्रतिस्थापित करने से समस्या हल हो गई। यह एंड्रॉइड 2.1 विशिष्ट प्रतीत होता है।

android:accountType="com.example.account"

इससे मुझे समस्या का हल निकालने में मदद मिली।
— स्काईजेक

44

सबसे पहले, इस पोस्ट पर बताई गई स्थिति की जाँच करें :

[...] यदि आपको AccountManagerServiceफ़ॉर्म से कोई त्रुटि दिखाई देती है caller uid XXXX is different than the authenticator's uid, तो यह थोड़ा भ्रामक हो सकता है। उस संदेश में 'प्रमाणक' आपका प्रमाणिक वर्ग नहीं है, यह वही है जो Android खाता के प्रकार के लिए पंजीकृत प्रमाणक होना समझता है। चेक AccountManagerServiceइस तरह दिखता है:

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

ध्यान दें कि hasAuthenticatorUid()लेता है account.type। यह वह जगह है जहाँ मैं खराब कर दिया है। मैं Accountएक निरंतर द्वारा निर्दिष्ट प्रकार के साथ अपना निर्माण कर रहा था :

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

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

लेकिन यह स्थिरांक मेरे प्रमाणक के लिए XML परिभाषा से मेल नहीं खाता:

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

दूसरा, यदि आप मेरे जैसे हैं और परीक्षण के लिए नमूना को अपने मौजूदा ऐप में एम्बेड करना चाहते हैं, तो सुनिश्चित करें कि आप Constantsउस वर्ग का उपयोग करते हैं जो इस उदाहरण का हिस्सा है और android.provider.SyncStateContractपैकेज के तहत नहीं । क्योंकि दोनों वर्ग ऑब्जेक्ट ACCOUNT_TYPEबनाते समय एक ही विशेषता नाम का उपयोग करते हैं Account।


धन्यवाद! आपके पहले चेक ने समस्या हल कर दी। और लगता है कि क्या, एक नई परियोजना में मैं सभी प्रमाणक xml फ़ाइल के बारे में भूल गया था!
— जॉर्ज प्लिगोरोपोलोस

7
मैं अभी भी इस मुद्दे को देख रहा हूं, लेकिन केवल अपने कुछ उपयोगकर्ताओं के लिए। मैंने डबल चेक किया है कि android: AuthTeator.xml फ़ाइल में खाता मेरे GenericAccountsService में स्थिर से मेल खाता है। मुझे यह भी पता है कि यह अपवाद मेरे अधिकांश एप्लिकेशन उपयोगकर्ताओं के लिए नहीं है, लेकिन मेरे क्रैश लॉग में अब हर बार और फिर मैं कुछ मुट्ठी भर उपयोगकर्ताओं के लिए क्रैश देखता हूं। कोई उपाय? क्या ऐसा करने के लिए किसी भी तरह से Authatorator.xml फ़ाइल को संशोधित किया जा सकता है?
— 20

3
@clu क्या आप कभी अपने मुद्दे को हल करने में सक्षम थे? मैं एक समान परिदृश्य का सामना कर रहा हूं। यह त्रुटि केवल मेरे उपयोगकर्ताओं के एक छोटे से अल्पसंख्यक के लिए फ़सल करती है: ज्यादातर एचटीसी वन एक्स, एचटीसी वन एसवी और एचटीसी डिज़ायर 500 की, साथ ही साथ कई अन्य उपकरणों की भी स्मर्टिंग।
— चांडी

1
@ चांदसी यहाँ भी। केवल HTC डिवाइसों में यह समस्या है। यह हर दूसरे डिवाइस के लिए ठीक काम करता है।
— किरण कुमार

@clu मैं भी इसी मुद्दे का सामना कर रहा हूं। क्या आप इसे हल करने में सक्षम थे या इसका मूल कारण ढूंढ सकते हैं?
— isig

25

मेरे मामले में समस्या बहुत ही बेमेल थी, res/xml/authenticator.xmlक्योंकि यह खाता बनाने में android:accountType="com.foo"गलत है, लेकिन गलत तरीके से संदर्भित किया गया "foo.com"है:

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

रवींद्र!


1
नमस्ते, मेरे मामले में xml और newAccount ऑब्जेक्ट में खाता दोनों समान हैं। फिर भी यह कॉलर यूआईडी दिखा रहा है XXXX प्रामाणिकता की यूआईडी त्रुटि से अलग है। क्यों?
— विजय वानखेडे

10

कस्टम खाता लागू करने के लिए कुछ भाग हैं ...

अपनी गतिविधि में खाता प्रबंधक को लागू करने के लिए, ऐसा कुछ जिसे आपने पहले ही लागू किया था ...

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

Res / xml / Authentator.xml में आपको अपने AccountAuthenticator Data (अपने Authenticator UID के लिए जिम्मेदार) को परिभाषित करना होगा। ACCESS_TYPE को इस 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>

अंत में आपको अपनी सेवा को अपना घोषणापत्र परिभाषित करना होगा। कृपया अपने खातों (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>

TYPO के लिए बाहर देखो! AuthenticaTAtionService। इसके अलावा यह वास्तव में नाम है = "। प्रामाणिकता सेवा" जाहिरा तौर पर, (एक डॉट के साथ) और यह मेरे मामले में लाल रंग में दिखाता है, लेकिन यह वैसे भी काम करता है।
— फ्लोरिअन

5

मेरी त्रुटि खाता प्रबंधक को मिल रही थी (मान) विधि केवल मेरे आवेदन संदर्भ से जुड़े खातों को लौटा रही थी। मैं इससे बदल गया

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

सेवा

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

4

यदि आप अपने इरादे-फ़िल्टर में गलत मान रखते हैं तो वही त्रुटि सामने आएगी। मैं सिंक-एडेप्टर पर एंड्रॉइड-डी ट्यूटोरियल के माध्यम से चला गया और सिंकडैप्टर / अकाउंटेंटहुलेटर के लिए "आशय-फ़िल्टर / एक्शन एंड्रॉइड: नाम" के साथ-साथ "मेटा-डेटा / एंड्रॉइड: नाम" के लिए एक बोगस मान सेट करना समाप्त कर दिया। इस गलती के कारण लॉग में वही त्रुटियां दिखाई दीं।

रिकॉर्ड के लिए, सही मान हैं: {android.content.SyncAdapter, android.accounts.AccountAuthenticic}


2

सुनिश्चित करें कि आपकी सेवा XML सही स्थान की ओर इशारा कर रही है।

उदाहरण के लिए यदि आप मॉड्यूल नाम हैं

com.example.module.auth

आप सेवा कर रहे हैं android: नाम होना चाहिए

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

में, AndriodManifest.xml


2

सबसे पहले, जान बर्केल की उत्कृष्ट डिबगिंग सलाह पर एक और नज़र डालें।

अंत में, जांच करने वाली एक और बात यह है कि आपके सामग्री प्रदाता और प्रमाणीकरण, और सिंक सेवाओं को applicationटैग के बच्चों के रूप में घोषित किया गया है ।

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

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

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

<एप्लीकेशन> का बच्चा! यह मेरे लिए किया, धन्यवाद! और यह है <सेवा Android: name = "। AuthenticationService">
— FlorianB

2

मेरे लिए यह बहुत मूर्खतापूर्ण गलती थी और इसे खोजना बहुत कठिन था।

प्रामाणिकता में। xml मैंने लिखा है

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

के बजाय

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

जो इस त्रुटि का कारण बन रहा था। आशा है कि यह किसी की मदद करता है!


2

मेरे मामले में यह मेरे पास प्रकट फ़ाइल में अनुमतियाँ थीं

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

यह सब कैप था, जब मैंने इसे बदल दिया

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

समस्या दूर हो गई


1

इसके अलावा,

यह देखने के लिए जांचें कि क्या आप एक साधारण-पुराने-स्ट्रिंग की तरह अकाउंटटेप का बहुत अधिक इलाज कर रहे हैं।

मेरे पास अपना अधिकांश कोड com.mycompany.android के तहत पैक है

मैं निम्नलिखित खाता सफलता के साथ उपयोग कर रहा हूं: com.mycompany.android.ACCOUNT ।

अब मुझे कई खातों का उपयोग करने की इच्छा है, और जब मैं अपने खाते के अंत में ".subType" को जोड़ने की कोशिश करता हूं, तो यह विफल हो जाता है

caller uid xxxxx प्रामाणिकता के यूआईडी से अलग है

हालांकि, अगर मैं "_subType" (डॉट के बजाय अंडरस्कोर) का उपयोग करता हूं, तो यह ठीक काम करता है।

मेरा अनुमान है कि कहीं न कहीं हुड के तहत एंड्रॉइड एक कानूनी पैकेज नाम के रूप में com.mycompany.android.ACCOUNT का इलाज करने की कोशिश कर रहा है, जो कि यह निश्चित रूप से नहीं है।

इसलिए फिर से:

BAD com.mycompany.android.ACCOUNT.subType

GOOD com.mycompany.android.ACCOUNT_subType


1

यदि आपको यह त्रुटि मिल रही है, और उपरोक्त सभी समाधान आपके लिए काम नहीं कर रहे हैं। इसके अलावा, आप मानते हैं कि आपने सभी प्रक्रिया का पालन किया है। ऐसा कोई मौका हो सकता है कि प्रमाणीकरण सेवा किसी अन्य डेवलपर द्वारा विकसित की गई है, जिसे आप एड अकाउंट्स का उपयोग करना चाहते हैं।

क्या आप कोशिश कर सकते हैं एक रिलीज कीस्टॉर के साथ अपने आवेदन पर हस्ताक्षर करने का प्रयास करें। अब आप एप्लीकेशन को रन करें। मुझे लगता है कि यह आपके लिए काम करना चाहिए।


1

यहाँ एक और संभव समाधान है।

मुझे यह त्रुटि तब हुई जब मेरे उपयोगकर्ता को उसी एंड्रॉइड Google खाते के रूप में उसी ई-मेल के साथ मेरे ऐप में पंजीकृत किया गया था।

इसलिए, जब मैंने accountManager.getAccounts()इस ई-मेल को खोजने और खोजने की कोशिश की, तो मुझे एक ही ई-मेल BUT के साथ एक खाता अन्य प्रकार के साथ मिला। इसलिए, जब इस (google.com) खाते का उपयोग करने की कोशिश कर रहा हूं तो मुझे यह त्रुटि मिलती है।

तो, खाता खोजने का सही तरीका है:

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

आप accountManager.getAccountsByType("myservice.com")इसके बजाय कॉल कर सकते हैं ।
— nickgrim

0

यह भी सुनिश्चित करें कि आपके AccountAuthenticatorService में प्रोवर आशय फ़िल्टर है;

अर्थात।

<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

यदि आपको सैमसंग डिवाइस पर यह अपवाद मिलता है, तो सुनिश्चित करें कि आप सुरक्षित मोड का उपयोग नहीं कर रहे हैं ।


0

यदि समान एप्लिकेशन अलग-अलग स्टोर से हैं, उदाहरण के लिए अमेज़ॅन ऐप स्टोर और Google Play स्टोर, अंततः सुरक्षा अपवाद को फेंक दिया जाएगा क्योंकि इस मामले में ऐप्स के हस्ताक्षर अलग-अलग होंगे। यदि आपने एकल के उद्देश्य के लिए एक ही प्रमाणक का उपयोग करने की योजना बनाई थी। साइन इन करें, या तो ऐप क्रैश हो जाएगा। मैंने एक बार इस मुसीबत का सामना किया था। विशेष रूप से अमेज़ॅन ऐप स्टोर सुरक्षा के उद्देश्य के लिए अपने स्वयं के हस्ताक्षर के साथ अपने ऐप पर हस्ताक्षर करेगा।

नोट: यदि यहां कोई टाइपो त्रुटि या अन्य उत्तर नहीं हैं, तो कृपया एकल साइन इन के मामले में एप्लिकेशन के हस्ताक्षर की जांच करें।


0

उन लोगों के लिए जो अभी भी समस्या का अनुभव कर रहे हैं: https://stackoverflow.com/a/37102317/4171098

मेरे मामले में मैंने आकस्मिक रूप से प्रामाणिकता को परिभाषित किया है <application>टैग्स के बाहर मैनिफेस्ट में । घोषणा को अंदर ले <application>जाकर मुद्दा तय किया। आशा है कि किसी की मदद करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.