노블의 개발이야기

[Android] AccountManager class 본문

Android

[Android] AccountManager class

더플러스 2017. 8. 11. 15:49

AccountManager class

이 클래스는 사용자의 온라인 계정의 중앙 집중식 레지스트리에 대한 액세스를 제공합니다.


사용자는 계정별로 자격 증명(username and password)를 한 번 입력하여 어플리케이션에 "one-click" 승인을 통한 온라인 리소스에 대한 접근 권한을 부여합니다.


온라인 서비스마다 계정 및 인증을 처리하는 방법이 다릅니다. 

그래서 Account Manager는 다양한 계정 유형에 대해 플러그 가능한 인증자 모듈을 사용합니다.


인증 기관(제 3자가 작성할 수 있음)은 계정 자격 증명(account credentials) 유효성 확인 및 계정 정보(account information) 저장에 대한 실제 제부 정보를 처리합니다.


많은 서버들은 사용자의 실제 password를 보내지 않고 서버에 인증을 요청하는데 사용할 수 있는 인증 토큰 개념을 지원합니다. (일반적으로 인증 토큰은 유저의 자격 증명(credentials)을 포함하는 별도의 요청으로 생성됩니다.)


AccountManager는 어플리케이션을 위한 인증 토큰을 생성할 수 있으므로 어플리케이션은 password를 직접 처리할 필요가 없습니다.


일반적으로 인증 토큰은 AccountManager에 의해 재사용 및 캐시되지만 주기적으로 갱신(refreshed) 해야합니다.


인증 토큰이 작동을 멈춰었을 때 인증 토큰을 무효화하는 것은 어플리케이션의 책임이므로 AccountManager는 이를 다시 생성해야 할 필요가 있다는 것을 알고 있습니다.



일반적으로 서버에 접근하는 어플리케이션은 다음 단계를 수행합니다.

  • get(Context)를 사용하여 AccountManager의 인스턴스를 가져옵니다.
  • getAccountsByType(String) 또는 getAccountsByTypeAndFeatures(String, String[], AccountManagerCallback, Handler)를 사용하여 사용가능한 계정(accounts)를 나열합니다. 일반적으로 어플리케이션은 인증자를 식별하는 하나의 특정 유형(type)의 계정에만 관심이 있습니다.
    Account 기능은 특정 계정 하위 유형(particular account subtypes) 및 기능(capabilities)를 식별하는데 사용됩니다.
    계정 타입(account type)과 기능(features) 모두 인증자 특정 문자열(authenticator-specific strings)이며 어플리케이션은 인증자와 협의하에 이를 알고 있어야 합니다.
  • 가능하면 사용자에게 환경 설정을 요청하여 사용 가능한 계정을 하나 이상 선택합니다.
    적합한 계정이 없는 경우 addAccount(String, String, String[], Bundle, Activity, AccountManagerCallback, Handler) 를 호출하여 사용자에게 적절한 유형의 계정을 생성하도록 요청할 수 있습니다.
  • Important: 어플리케이션에서 이전에 기억된 계정 선택을 사용하는 경우, 계정이 getAccountByType(String)에 의해 반환되는 리스트에 계속 있는지 확인해야 합니다.
    더 이상 장치에 없는 계정에 대한 인증 토큰을 요청하면 정의되지 않은 오류가 발생합니다.
  • getAuthToken(Account, String, Bundle, Activity, AccountManagerCallback, Handler) 또는 관련 Helpers를 이용하여 선택된 계정에 대한 인증 토큰을 요청합니다.
  • 인증 토큰을 사용하여 요청(request)를 만듭니다. 인증 토큰의 형식, 요청(request)의 형식(format) 그리고 프로토콜은 서비스에 따라 다릅니다.
  • Important: 만약 인증 오류로 요청이 실패하면, 캐시된 인증 토큰이 오래되어 더 이상 서버에서 승이되지 않을 수 있습니다.
    어플리케이션은 invalidateAuthToken(String, String)을 호출하여 캐시에서 토큰을 제거해야 합니다.
    그렇지 않으면 요청이 계속 실패합니다.
    인증 토큰을 무효화한 후 즉시 "인증 토큰 요청" 단계로 되돌아갑니다. 만약, 프로세스가 두 번째 실패하면 "정품(genuine)" 인증 실패로 간주하고 사용자에게 알리거나 다른 적절한 조치를 취해야 합니다.

일부 AccountManager 메서드는 자격 증명을 요구하거나 옵션을 표시하거나 사용자에게 계정을 추가하도록 요청하기 위해 사용자와 상호 작용해야 할 수 있습니다.

호출자는 필요한 사용자 인터페이스를 직접 실행하고 사용자를 기다리거나, 호출자가 인터페이스를 실행에 사용할 수 있는 intent를 반환하거나, (어떤 경우에는)인퍼페이스를 실행하기 위해 언제든지 사용자가 선택할 수 있는 통지(notification)을 설치하여 AcccountManager 허용 여부 선택할 수 있습니다. 

AccountManager가 인터페이스를 직접 실행하게 하려면 호출자는 현재 포어그라운드 Activity context를 제공해야 합니다.


AccountManager 메소드들은 AccountManagerCallback과 Handler를 매개 변수(parameters)로 사용합니다. 

이 메소드들은 호출 즉시 반환하고 비동기적으로 동작합니다. 

callback이 제공되면 run(AccountManagerFuture)는 요청이 완료(successfully or not)되면 Handler의 스레드에서 호출되어집니다. 

결과는 메서드에 의해 반환된 AccountManagerFuture의 getResult()를 호출하여 검색됩니다. (또한 콜백으로 전달됩니다.) 

이 메서드는 작업이 완료될 때까지 기다렸다가(필요한 경우) 결과를 반환하거나 작업 중에 오류가 발생하면 예외를 throw 합니다. 

요청을 동기식으로 만들려면 메서드에서 future를 수신하는 즉시 getResult()를 호출하십시요, 콜백을 제공할 필요가 없습니다.


getResult()를 포함하여 block될 수 있는 요청은 어플리케이션의 main event thread에서 절대로 호출되어서는 안됩니다. 

메인 스레드에서 사용되는 경우 IllegalStateException을 throw 합니다.


이 클래스의 인스턴스는 Context.ACCOUNT_SERVICE를 인수로 하는 Context.getSystemService(String) 또는 AccountManager.class를 인수로 하는 Context.getSystemService(Class) 사용하여 획득해야합니다.


Comments