다음을 통해 공유


단일 및 다중 계정 퍼블릭 클라이언트 앱

이 문서는 단일 계정 퍼블릭 클라이언트 앱에 중점을 두고 단일 및 다중 계정 퍼블릭 클라이언트 앱에서 사용되는 형식을 이해하는 데 도움이 됩니다.

MSAL(Microsoft 인증 라이브러리)은 클라이언트 애플리케이션을 모델링합니다. 대다수 Android 앱은 퍼블릭 클라이언트로 간주합니다. 퍼블릭 클라이언트는 비밀을 안전하게 유지할 수 없는 앱입니다.

MSAL은 한 번에 하나의 계정만 사용할 수 있는 앱의 개발 환경을 간소화하고 명확하게 지정하기 위해 PublicClientApplication의 API 표면을 특수화합니다. PublicClientApplicationSingleAccountPublicClientApplicationMultipleAccountPublicClientApplication에 의해 서브클래싱됩니다. 다음 다이어그램에서는 관련 리소스 간 관계를 보여 줍니다.

SingleAccountPublicClientApplication UML 클래스 다이어그램

단일 계정 퍼블릭 클라이언트 애플리케이션

SingleAccountPublicClientApplication 클래스를 사용하면 한 번에 단일 계정만 로그인할 수 있는 MSAL 기반 앱을 만들 수 있습니다. SingleAccountPublicClientApplicationPublicClientApplication 의 차이점은 다음과 같습니다.

  • MSAL은 현재 로그인한 계정을 추적합니다.
    • 앱이 broker(Azure Portal 앱 등록 중에 기본값)를 사용하고 broker가 있는 디바이스에 설치된 경우 MSAL은 디바이스에서 계정을 계속 사용할 수 있는지 확인합니다.
  • signIn을 사용하여 요청하는 범위에서 명시적으로 및 개별적으로 로그인할 수 있습니다.
  • acquireTokenSilent에는 계정 매개 변수가 필요하지 않습니다. 계정을 제공하는데 제공하는 계정이 MSAL에서 추적한 현재 계정과 일치하지 않으면 MsalClientException이 throw됩니다.
  • acquireToken을 사용하면 사용자가 계정을 전환할 수 없습니다. 사용자가 다른 계정으로 전환하려고 하면 예외가 throw됩니다.
  • getCurrentAccount는 다음을 제공하는 결과 개체를 반환합니다.
    • 계정이 변경되었는지 여부를 나타내는 부울입니다. 예를 들어, 디바이스에서 제거된 결과로 계정이 변경될 수 있습니다.
    • 이전 계정입니다. 이는 계정이 디바이스에서 제거되거나 새 계정이 로그인될 때 로컬 데이터 정리를 수행해야 하는 경우에 유용합니다.
    • currentAccount입니다.
  • signOut은 디바이스에서 클라이언트와 연결된 모든 토큰을 제거합니다.

Microsoft Authenticator 또는 Intune 회사 포털과 같은 Android 인증 broker가 디바이스에 설치되어 있고 앱이 broker를 사용하도록 구성된 경우 signOut은 디바이스에서 계정을 제거하지 않습니다.

단일 계정 시나리오

다음 의사 코드에서는 SingleAccountPublicClientApplication을 사용하는 방법을 보여 줍니다.

// Construct Single Account Public Client Application
ISingleAccountPublicClientApplication app = PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will get a UI prompt before getting the token.
app.signIn(getActivity(), scopes, new AuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
    }
);

// Load Account Specific Data
getDataForAccount(account);

// Get Current Account
ICurrentAccountResult currentAccountResult = app.getCurrentAccount();
if (currentAccountResult.didAccountChange())
{
    // Account Changed Clear existing account data
    clearDataForAccount(currentAccountResult.getPriorAccount());
    mAccount = currentAccountResult.getCurrentAccount();
    if (account != null)
    {
        //load data for new account
        getDataForAccount(account);
    }
}

// Sign out
if (app.signOut())
{
    clearDataForAccount(mAccount);
    mAccount = null;
}

다중 계정 퍼블릭 클라이언트 애플리케이션

MultipleAccountPublicClientApplication 클래스는 여러 계정이 동시에 로그인할 수 있는 MSAL 기반 앱을 만드는 데 사용됩니다. 이를 통해 다음과 같이 계정을 가져오고, 추가하고, 제거할 수 있습니다.

계정 추가

acquireToken을 한 번 이상 호출하여 애플리케이션에서 하나 이상의 계정을 사용합니다.

계정 가져오기

  • getAccount를 호출하여 특정 계정을 가져옵니다.
  • getAccounts를 호출하여 현재 앱에 알려진 계정 목록을 가져옵니다.

앱은 broker 앱에 알려진 디바이스에서 일부 Microsoft ID 플랫폼 계정을 열거할 수 없습니다. 앱에서 사용된 계정만 열거할 수 있습니다. 디바이스에서 제거된 계정은 해당 함수에서 반환되지 않습니다.

계정 제거

계정 식별자로 removeAccount를 호출하여 계정을 제거합니다.

앱이 broker를 사용하도록 구성되고 broker가 디바이스에 설치된 경우에는 removeAccount를 호출할 때 계정이 broker에서 제거되지 않습니다. 클라이언트와 연결된 토큰만 제거됩니다.

다중 계정 시나리오

다음 의사 코드는 다중 계정 앱을 만들고, 디바이스에 계정을 나열하고, 토큰을 획득하는 방법을 보여 줍니다.

// Construct Multiple Account Public Client Application
IMultipleAccountPublicClientApplication app = PublicClientApplication.createMultipleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will be required to interact with a UI to obtain a token
app.acquireToken(getActivity(), scopes, new AuthenticationCallback()
 {

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
 });

...

// Get the default authority
String authority = app.getConfiguration().getDefaultAuthority().getAuthorityURL().toString();

// Get a list of accounts on the device
List<IAccount> accounts = app.getAccounts();

// Pick an account to obtain a token from without prompting the user to sign in
IAccount selectedAccount = accounts.get(0);

// Get a token without prompting the user
app.acquireTokenSilentAsync(scopes, selectedAccount, authority, new SilentAuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }
});