AccountManager 和签名检查

AccountManager and signature check

Security tipsAccountManager 相关的章节提到:

If credentials are used only by applications that you create, you can verify the application that accesses the AccountManager using checkSignature().

我应该在代码的什么地方检查签名?我已经尝试使用 Binder.getCallingUid() 在我自己的 AbstractAccountAuthenticator 实现中获取调用进程的 UID,但它 returns 1000 因为系统进程执行 IPC。我需要获取尝试访问我的应用程序创建的帐户的其他应用程序的 UID/package 名称,因为我想在返回授权令牌之前执行 checkSignature 检查。

事实证明这很简单。真正调用者的包名、uid 和 pid 包含在作为参数传递的 Bundle 中。此代码应位于 AbstractAccountAuthenticator.

的实现中
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
                           String authTokenType, Bundle bundle) {
    try {
        PackageManager packageManager = context.getPackageManager();
        String callerPackageName = bundle.getString("androidPackageName");
        // Caller app must be signed with the same key to get the auth token
        int signatureResult = packageManager.checkSignatures(BuildConfig.APPLICATION_ID,
                callerPackageName);
        if (signatureResult >= PackageManager.SIGNATURE_MATCH) {
            return [bundle with the auth token];
        } else {
            return Bundle.EMPTY;
        }
}