2012-04-26 13 views
5

Próbuję uzyskać informacje o Androidzie AccountManager i OAuth. Nie chcę pozwolić telefonowi na dostęp do hasła. (Tak właśnie Google sugeruje: "Be Smart About Security!") Więc wypisuję przykładową aplikację Google SampleSyncAdapter i zaczynam czytać kod. Wtedy widzę to się stało w AuthenticatorActivity:SampleSyncAdapter przechowywanie hasła zwykły tekst?

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);   
    .... 
} 

wiadomość Ten dziennik jest "mPassword ustawiony na konto: Test". Jest to w pewnym sensie zrozumiałe, kiedy przeczytać resztę z tego powodu

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

jeśli hasło było token to nie będzie działać.

Również oczekiwałbym, że reszta kodu zadziała inaczej w Authenticator na getAuthToken() Zakładam, że jestem całkowicie w błędzie co do czegoś, ale chcę tylko użyć AccountManagera do przechowywania wyniku OAuth "Dance", tak aby mogę używać tego konta do uwierzytelniania mojej usługi RESTful JSON.

Czy ktoś może oświetlić to zdjęcie?

Odpowiedz

0

Z dokumentacji możemy odczytać tak:

ważne jest, aby zrozumieć, że nie jest AccountManager usługa szyfrowania lub brelok. Przechowuje poświadczenia konta w momencie ich przekazywania, w postaci zwykłego tekstu. Na większości urządzeń nie stanowi to szczególnej troski, ponieważ przechowuje je w bazie danych dostępnej tylko dla roota. Ale na urządzeniu zrootowanym dane uwierzytelniające byłyby czytelne dla każdego, kto ma dostęp do urządzenia adb.

Tak więc, jak rozumiem, tutaj jest problem niewłaściwego użycia słów (hasło i token). Domyślam się, że procedura jest następująca:

  1. Poprosić użytkownika o podanie loginu i hasła.
  2. W swojej aplikacji w jakiś sposób przesyłasz ten login i hasło do swojego serwera.
  3. Na podstawie tych informacji serwer generuje token i odsyła go do aplikacji.
  4. AccountManager przechowuje ten token w postaci zwykłego tekstu, a następnie ten token służy do uwierzytelnienia użytkownika.
+0

Co się stanie, jeśli token zostanie unieważniony po upływie określonego czasu? Myślę, że po prostu musisz ponownie poprosić użytkownika o podanie hasła w tym przypadku. Jednak wiele serwisów (np. Facebook) nigdy nie prosi mnie o hasło, więc albo 1) wygenerowany token nigdy nie wygasa, co czyni go zasadniczo tak dobrym jak hasło pod względem bezpieczeństwa, albo 2) przechowują moje hasło (zwykły tekst lub zaszyfrowane). –

Powiązane problemy