5

Android AccountManager と OAuth について頭を悩ませようとしています。私がしたいのは、電話がパスワードにアクセスできないようにすることです。(これが Google の提案です。「セキュリティについて賢くなれ!」) そこで、Google のサンプル アプリケーションSampleSyncAdapterをチェックアウトし、コードを読み始めます。次に、AuthenticatorActivity でこれが発生するのを確認します。

private AccountManager mAccountManager;
private String mPassword;

 /**
 * ... Sets the
 * AccountAuthenticatorResult which is sent back to the caller. We store the
 * authToken that's returned from the server as the 'password' for this
 * account - so we're never storing the user's actual password locally.
 *
 * @param result the confirmCredentials result.
 */
public void handleLogin(View view) {
    ....
    mPassword = mPasswordEdit.getText().toString();    
    ....
    Log.d(TAG, "mPassword set to Account:" + mAccountManager.getPassword(account));
}

private void finishLogin(String authToken) {
    ....
    mAccountManager.addAccountExplicitly(account, mPassword, null);        
    ....
}

このログ メッセージは「mPassword set to Account:test」です。これは、このため、残りを読むとある程度理解できます

protected String doInBackground(Void... params) {
    ....
    return NetworkUtilities.authenticate(mUsername, mPassword);     
    ....
}

パスワードがトークンの場合、これは機能しません。

また、getAuthToken() の Authenticator で残りのコードが異なる動作をすることを期待します。何かについて完全に間違っていると思いますが、AccountManager を使用して OAuth「ダンス」の結果を保存し、このアカウントを使用できるようにしたいだけです。 JSON RESTful サービスを認証します。

誰でもこれに光を当てることができますか?

4

1 に答える 1

0

ドキュメントから、これを読むことができます:

AccountManager は暗号化サービスやキーチェーンではないことを理解することが重要です。アカウント資格情報は、渡されたとおりにプレーン テキストで保存されます。ほとんどのデバイスでは、ルートのみがアクセスできるデータベースに保存されるため、これは特に問題ではありません。ただし、ルート化されたデバイスでは、デバイスへの adb アクセス権を持つすべてのユーザーが資格情報を読み取ることができます。

したがって、私が理解しているように、ここに単語 (パスワードとトークン) の誤用の問題があります。手順は次のとおりだと思います。

  1. ユーザーにログインとパスワードを提供するように求めます。
  2. アプリケーションでは、何らかの方法でこのログインとパスワードをサーバーに送信します。
  3. この情報に基づいて、サーバーはトークンを生成し、アプリケーションに送り返します。
  4. AccountManager はこのトークンをプレーン テキストで保存し、このトークンを使用してユーザーを認証します。
于 2012-07-22T14:56:18.240 に答える