5

我正在尝试了解 Android AccountManager 和 OAuth。我想做的是不让手机访问密码。(这就是谷歌的建议:“对安全要聪明! ”)所以我检查了谷歌示例应用程序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 设置为 Account:test”。当您阅读其余部分时,这在某种程度上是可以理解的,因为

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

如果密码是令牌,这将不起作用。

此外,我希望其余代码在 getAuthToken() 上的 Authenticator 中以不同方式工作验证我的 JSON RESTful 服务。

任何人都可以对此有所了解吗?

4

1 回答 1

0

从文档中我们可以读到:

重要的是要了解 AccountManager 不是加密服务或钥匙串。它以纯文本形式存储帐户凭据,就像您传递它们一样。在大多数设备上,这不是一个特别的问题,因为它将它们存储在一个只能由 root 访问的数据库中。但是在有根设备上,任何对设备具有 adb 访问权限的人都可以读取凭据。

因此,据我了解,这是滥用单词(密码和令牌)的问题。我猜过程如下:

  1. 您要求用户提供登录名和密码。
  2. 在您的应用程序中,您以某种方式将此登录名和密码发送到您的服务器。
  3. 根据这些信息,您的服务器会生成一个令牌并将其发送回您的应用程序。
  4. AccountManager 以纯文本形式存储此令牌,然后使用此令牌对您的用户进行身份验证。
于 2012-07-22T14:56:18.240 回答