3

我有一个自定义身份验证器,我想将用户/密码公开给其他应用程序。为了防止任何随机应用程序获取凭据,我想在我的自定义身份验证器的getAuthToken()方法中执行权限检查之类的操作。什么是正确的方法?

我试过这个,

    int p = context.checkCallingPermission("com.whatever.AUTH");
    if (p != PackageManager.PERMISSION_GRANTED) {

在托管我的身份验证器的应用程序中定义了“com.whatever.AUTH”,

<permission android:name="com.vmware.horizon.AUTH" />

uses-permission但是,在我的清单中没有的测试应用程序中,当我请求帐户时,

    AccountManagerFuture<Bundle> future = am.getAuthToken(new Account(
            "com.whatever", "com.whatever"),
            "com.whatever", new Bundle(), this,
            new AccountManagerCallback<Bundle>() {

                @Override
                public void run(AccountManagerFuture<Bundle> future) {
                                        String token  = result.getString(AccountManager.KEY_AUTHTOKEN);

                }
            }, handler);

我成功获得了身份验证令牌。调试显示对我的身份验证器getAuthToken()方法的调用发生了,但检查权限调用返回“已授予”。

编辑:如果我从我用来调用checkCallingPermission()它的上下文中获取包名称,则它是托管自定义身份验证器的应用程序的包名称。如果我得到调用 PID,UID 它们分别是 0 和 1000。

有任何想法吗?

4

1 回答 1

5

在查看 Android 源代码时,我注意到帐户管理器服务将 Bundle 上的调用者的 pid 和 uid 设置为AccountManager.KEY_CALLER_PIDAccountManager.KEY_CALLER_UID

您可以使用getInt()捆绑包在 getAppToken 方法中找出真正的调用者的 pid 和 uid。

另一个很难找到的有用信息。由于帐户管理器服务缓存了结果,因此该getAppToken方法通常只调用一次。如果您希望能够更积极地管理令牌,您可以通过将元数据添加到清单条目来禁用缓存:

<service android:name=".authenticator.AccountAuthenticatorService">
  <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator"/>
  <meta-data android:name="android.accounts.AccountAuthenticator.customTokens" android:value="1"/>
</service>

下面是验证器 xml 的样子:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
  android:accountType="com.your.account.type"
  android:customTokens="true"
  android:icon="@drawable/logo"
  android:smallIcon="@drawable/logo"
  android:label="@string/app_name_long"/>
于 2013-03-28T19:53:19.760 回答