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 のソース コードを確認したところ、アカウント マネージャー サービスがバンドルの呼び出し元の pid と uid を と に設定していることに気付きましAccountManager.KEY_CALLER_PIDAccountManager.KEY_CALLER_UID

バンドルで使用getInt()して、getAppToken メソッドで実際の呼び出し元の pid と uid を見つけることができます。

見つけるのが難しい可能性があるもう 1 つの有用な情報。アカウント マネージャー サービスが結果をキャッシュするため、このgetAppTokenメソッドは多くの場合 1 回だけ呼び出されます。トークンをより積極的に管理できるようにしたい場合は、マニフェスト エントリにメタデータを追加してキャッシュを無効にすることができます。

<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 に答える