SecurityException: uid của người gọi XXXX khác với uid của trình xác thực


84

Tôi đã nhận được ngoại lệ ở trên khi cố gắng triển khai ứng dụng Bộ điều hợp đồng bộ hóa mẫu. Tôi đã xem nhiều bài viết liên quan đến vấn đề này nhưng không có phản hồi thỏa đáng.

Vì vậy, tôi sẽ ghi lại giải pháp của mình ở đây trong trường hợp bất kỳ ai khác gặp phải vấn đề tương tự.


Cảm ơn. Tôi gặp phải vấn đề này và có thể tìm ra giải pháp nhanh hơn nhờ bài đăng của bạn.
Damian

4
Thật không may, liên kết được đăng đã bị hỏng trong thời gian chờ đợi. Ai đó có giải pháp thay thế không?
johsin18

Câu trả lời:


54

Một số mẹo hữu ích khác để gỡ lỗi các vấn đề như thế này.

Đầu tiên hãy bật tính năng ghi nhật ký chi tiết cho một số thẻ:

$ 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

Bạn sẽ thấy ghi nhật ký như thế này:

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

Có nghĩa là không có người xác thực nào đăng ký cho loại tài khoản này. Để xem trình xác thực nào được đăng ký, hãy xem nhật ký khi cài đặt gói:

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

Tôi đã gặp sự cố khi trình mô tả xml của trình xác thực tham chiếu đến tài nguyên chuỗi không được giải quyết đúng cách trong quá trình cài đặt:

android:accountType="@string/account_type"

Các bản ghi cho thấy

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

Thay thế nó bằng một chuỗi bình thường (không phải tài nguyên) đã giải quyết được vấn đề. Đây có vẻ là Android 2.1 cụ thể.

android:accountType="com.example.account"

Điều này đã giúp tôi giải quyết vấn đề.
skygeek

44

Trước tiên, hãy kiểm tra điều kiện được giải thích trên bài đăng này :

[...] Nếu bạn thấy lỗi từ AccountManagerServicebiểu mẫu caller uid XXXX is different than the authenticator's uid, nó có thể gây hiểu nhầm một chút. 'Trình xác thực' trong thông báo đó không phải là lớp trình xác thực của bạn, mà Android hiểu là trình xác thực đã đăng ký cho loại tài khoản. Kiểm tra xảy ra bên trong AccountManagerServicetrông giống như sau:

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

Lưu ý rằng hasAuthenticatorUid()account.type. Đây là nơi tôi đã hoàn thành. Tôi đã tạo của tôi Accountvới một kiểu được chỉ định bởi một hằng số:

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

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

nhưng hằng số này không khớp với định nghĩa XML cho trình xác thực của tôi:

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

Thứ hai, nếu bạn giống tôi và muốn nhúng mẫu vào ứng dụng hiện có của bạn để thử nghiệm, hãy đảm bảo bạn sử dụng Constantslớp là một phần của ví dụ này chứ không phải trong android.provider.SyncStateContractgói. Bởi vì cả hai lớp sử dụng cùng một tên thuộc tính ACCOUNT_TYPEđược sử dụng khi tạo Accountđối tượng.


Cảm ơn! séc đầu tiên của bạn đã giải quyết được vấn đề. Và đoán xem, trong một dự án mới, tôi đã quên tất cả về tệp xml của trình xác thực.!
George Pligoropoulos

7
Tôi vẫn gặp sự cố này nhưng chỉ xảy ra với một số người dùng của tôi. Tôi đã kiểm tra kỹ để đảm bảo rằng android: accountType trong tệp authenticator.xml khớp với hằng số trong GenericAccountsService của tôi. Tôi cũng biết rằng ngoại lệ này không xảy ra với đại đa số người dùng ứng dụng của tôi, nhưng trong nhật ký sự cố của tôi thỉnh thoảng tôi thấy lỗi xảy ra cho một số ít người dùng. Bất kỳ ý tưởng? Có thể sửa đổi tệp authenticator.xml bằng cách nào đó để gây ra điều này không?
b.lit

3
@clu Bạn đã bao giờ có thể giải quyết sự cố của mình chưa? Tôi đang đối mặt với một kịch bản giống hệt nhau. Lỗi này chỉ xảy ra đối với một số ít người dùng của tôi: hầu hết trên HTC One X, HTC One SV và HTC Desire 500, cũng như một số thiết bị khác.
chandsie

1
@chandsie Tương tự ở đây. Chỉ có thiết bị HTC có vẻ như gặp vấn đề này. Nó hoạt động tốt cho mọi thiết bị khác.
Kiran Kumar

@clu Tôi cũng đang đối mặt với vấn đề tương tự. Bạn có thể giải quyết vấn đề này hay tìm ra nguyên nhân gốc rễ của nó không?
wasaig

25

Trong trường hợp của tôi là vấn đề rất đơn giản là một không phù hợp trong accountType khai báo trong res/xml/authenticator.xmlkhi android:accountType="com.foo"nhưng tham chiếu không đúng như "foo.com"trong việc tạo ra tài khoản:

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

Doh!


1
Xin chào, Trong trường hợp của tôi, accountType trong xml và trong đối tượng newAccount đều giống nhau. Vẫn hiển thị uid của người gọi XXXX khác với lỗi uid của trình xác thực. tại sao?
Vijay Vankhede

10

Có một số phần để triển khai tài khoản tùy chỉnh ...

Để gọi AccountManager trong Activity của bạn, một cái gì đó giống như bạn đã triển khai ...

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

Trong res / xml / authenticator.xml, bạn phải xác định dữ liệu AccountAuthenticator của mình (chịu trách nhiệm về UID Authenticator của bạn). ACCESS_TYPE phải cùng một chuỗi với accountType đã xác định của bạn trong xml này!

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

Cuối cùng, bạn phải xác định dịch vụ của mình Manifest của bạn. Xin đừng quên các quyền liên quan để quản lý tài khoản của bạn (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>

Hãy coi chừng TYPO! AuthenticaTAtionService. Thêm vào đó, nó thực sự là tên = ". AuthenticationService", (có dấu chấm) và nó hiển thị màu đỏ trong trường hợp của tôi, nhưng nó vẫn hoạt động.
FlorianB

5

Lỗi của tôi là giả sử phương thức AccountManager getAccounts () trả lại các tài khoản chỉ được liên kết với ngữ cảnh ứng dụng của tôi. Tôi đã thay đổi từ

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

đến

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

4

Lỗi tương tự sẽ xuất hiện nếu bạn đặt các giá trị không chính xác trong bộ lọc ý định trong tệp kê khai của mình. Tôi đã xem qua hướng dẫn android-dev về bộ điều hợp đồng bộ và kết thúc việc thiết lập giá trị không có thật cho "bộ lọc ý định / hành động android: tên" cũng như "siêu dữ liệu / android: tên" cho bộ lọc / accountauthenticator. Lỗi này gây ra các lỗi tương tự xuất hiện trong nhật ký.

Đối với bản ghi, các giá trị chính xác là: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}


2

Đảm bảo rằng XML dịch vụ của bạn đang trỏ đến đúng vị trí.

Ví dụ: nếu bạn tên mô-đun là

com.example.module.auth

bạn là dịch vụ android: tên phải là

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

trong AndriodManifest.xml


2

Trước hết, hãy xem xét lại lời khuyên gỡ lỗi tuyệt vời của Jan Berkel.

Cuối cùng, một điều khác cần kiểm tra là nhà cung cấp nội dung của bạn và các dịch vụ xác thực và đồng bộ hóa có được khai báo là con của applicationthẻ hay không.

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

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

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

Con của <ứng dụng>! Đã làm điều đó cho tôi, cảm ơn! Và đó là <service android: name = ". AuthenticationService">
FlorianB

2

Đối với tôi đó là một sai lầm rất ngớ ngẩn và rất khó tìm ra.

Trong authenticator.xml tôi đã viết

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

thay vì

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

đã gây ra lỗi này. Hy vọng điều này sẽ giúp ai đó!


2

Trong trường hợp của tôi, đó là quyền trong tệp kê khai mà tôi có

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

nó hoàn toàn viết hoa, khi tôi thay đổi nó thành

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

vấn đề đã biến mất


1

Cũng thế,

Kiểm tra xem liệu bạn có đang coi AccountType giống như một Chuỗi đơn thuần hay không.

Tôi có hầu hết mã của mình được đóng gói dưới com.mycompany.android

Tôi đã sử dụng AccountType sau thành công: com.mycompany.android.ACCOUNT .

Bây giờ tôi muốn sử dụng nhiều tài khoản và khi tôi thử cách tiếp cận thêm ".subType" vào cuối tài khoản của mình, nó không thành công với

uid của người gọi xxxxx khác với uid của người xác thực

Tuy nhiên, nếu tôi sử dụng "_subType" (gạch dưới thay vì dấu chấm), nó hoạt động tốt.

Tôi đoán là ở đâu đó, Android đang cố gắng coi com.mycompany.android.ACCOUNT là tên gói hợp pháp, mà chắc chắn là không.

Vì vậy, một lần nữa:

BAD com.mycompany.android.ACCOUNT.subType

TỐT com.mycompany.android.ACCOUNT_subType


1

Nếu bạn đang gặp lỗi này và tất cả các giải pháp trên không hiệu quả với bạn. Ngoài ra, bạn giả sử rằng bạn đã làm theo tất cả các quy trình. Có thể có khả năng Dịch vụ xác thực được phát triển bởi một số nhà phát triển khác mà bạn muốn sử dụng để Thêm tài khoản.

Những gì bạn có thể thử là thử ký ứng dụng của mình bằng kho khóa phát hành. Bây giờ bạn chạy ứng dụng. Tôi cho rằng điều này sẽ làm việc cho bạn.


1

Đây là một giải pháp khả thi khác.

Tôi đã gặp lỗi này khi người dùng của tôi đã đăng ký trong ứng dụng của tôi bằng cùng một e-mail với tài khoản google android của anh ấy.

Vì vậy, khi tôi cố gắng accountManager.getAccounts()và tìm kiếm e-mail này, tôi đã tìm thấy một tài khoản có cùng e-mail NHƯNG với một loại tài khoản khác. Vì vậy, khi cố gắng sử dụng tài khoản này (google.com), tôi gặp lỗi này.

Vì vậy, cách đúng để tìm tài khoản là:

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

Bạn có thể gọi accountManager.getAccountsByType("myservice.com")thay thế.
nickgrim

0

Ngoài ra, hãy đảm bảo AccountAuthenticatorService của bạn có các bộ lọc ý định;

I E.

<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

Nếu bạn gặp trường hợp ngoại lệ này ở các thiết bị Samsung, hãy chắc chắn rằng bạn đang không sử dụng chế độ an toàn .


0

Nếu các ứng dụng giống nhau đến từ các cửa hàng khác nhau, chẳng hạn như cửa hàng ứng dụng amazon và cửa hàng google play, thì ngoại lệ bảo mật cuối cùng sẽ được đưa ra vì chữ ký của các ứng dụng sẽ khác trong trường hợp này. Nếu bạn đã định sử dụng cùng một trình xác thực cho mục đích duy nhất đăng nhập, một trong hai ứng dụng sẽ bị lỗi. tôi đã gặp rắc rối này một lần. Đặc biệt cửa hàng ứng dụng amazon sẽ ký các ứng dụng của mình bằng chữ ký riêng nhằm mục đích bảo mật.

Lưu ý: Nếu không có lỗi đánh máy hoặc các câu trả lời khác được đề cập ở đây, vui lòng kiểm tra chữ ký của ứng dụng trong trường hợp đăng nhập một lần.


0

Đối với những người vẫn gặp sự cố: https://stackoverflow.com/a/37102317/4171098

Trong trường hợp của tôi, tôi đã vô tình xác định AuthenticatorService trong Tệp kê khai bên ngoài các <application>thẻ. Di chuyển khai báo bên trong đã <application>khắc phục sự cố. Hy vọng sẽ giúp ích cho ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.