1. ホーム
  2. android

[解決済み] SecurityException: 発呼側の uid XXXX が認証側の uid と異なる。

2023-05-20 15:50:14

質問

Sample Sync Adapter アプリケーションを実装しようとしたところ、上記のような例外が発生しました。この問題に関連する多くの投稿を見ましたが、満足のいく回答がありません。

そこで、以下のようにメモしておきます。 私の解決策 をここに書き留めておきます。

どのように解決するのですか?

まず、以下の条件を確認します。 この記事 :

[...] もし、あなたが 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 オブジェクトを作成するときに使用されます。