자습서: 네이티브 인증을 위한 Android 모바일 앱 준비
이 자습서에서는 Android 모바일 앱에 MSAL(Microsoft 인증 라이브러리) 네이티브 인증 SDK를 추가하는 방법을 보여 줍니다.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- MSAL 종속성을 추가합니다.
- 구성 파일을 만듭니다.
- MSAL SDK 인스턴스를 만듭니다.
필수 조건
- 아직 없는 경우 네이티브 인증을 사용하여 샘플 Android(Kotlin) 모바일 앱에서 사용자 로그인의 지침을 따르고 외부 테넌트에 앱을 등록합니다. 다음 단계를 완료해야 합니다.
- 애플리케이션을 등록합니다.
- 공용 클라이언트 및 네이티브 인증 흐름을 사용하도록 설정합니다.
- API 권한을 부여합니다.
- 사용자 흐름을 만듭니다.
- 앱을 사용자 흐름과 연결합니다.
- Android 프로젝트입니다. Android 프로젝트가 없는 경우 만드세요.
MSAL 종속성 추가
Android Studio에서 프로젝트를 열거나 새 프로젝트를 만듭니다.
애플리케이션의
build.gradle
를 열고 다음 종속성을 추가합니다.allprojects { repositories { //Needed for com.microsoft.device.display:display-mask library maven { url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1' name 'Duo-SDK-Feed' } mavenCentral() google() } } //... dependencies { implementation 'com.microsoft.identity.client:msal:5.+' //... }
Android Studio에서 파일>Gradle 파일과 프로젝트 동기화를 선택합니다.
구성 파일 만들기
JSON 구성 설정을 통해 애플리케이션(클라이언트) ID와 같은 필수 테넌트 식별자를 MSAL SDK에 전달합니다.
다음 단계를 사용하여 구성 파일을 만듭니다.
Android Studio의 프로젝트 창에서 app\src\main\res로 이동합니다.
res를 마우스 오른쪽 단추로 클릭하고 새로 만들기>디렉터리를 선택합니다. 새 디렉터리 이름으로
raw
를 입력하고 확인을 선택합니다.app\src\main\res\raw에서
auth_config_native_auth.json
이라는 새 JSON 파일을 만듭니다.auth_config_native_auth.json
파일에서 다음 MSAL 구성을 추가합니다.{ "client_id": "Enter_the_Application_Id_Here", "authorities": [ { "type": "CIAM", "authority_url": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Subdomain_Here.onmicrosoft.com/" } ], "challenge_types": ["oob"], "logging": { "pii_enabled": false, "log_level": "INFO", "logcat_enabled": true } } //...
다음 자리 표시자를 Microsoft Entra 관리 센터에서 가져온 테넌트 값으로 바꿉니다.
Enter_the_Application_Id_Here
자리 표시자를 이전에 등록한 앱의 애플리케이션(클라이언트) ID로 바꿉니다.Enter_the_Tenant_Subdomain_Here
를 디렉터리(테넌트) 하위 도메인으로 바꿉니다. 예를 들어, 테넌트 기본 도메인이contoso.onmicrosoft.com
인 경우contoso
를 사용합니다. 테넌트 이름이 없는 경우 테넌트 세부 정보를 읽는 방법을 알아봅니다.
챌린지 유형은 앱이 지원하는 인증 방법에 대해 Microsoft Entra에 알리는 데 사용하는 값 목록입니다.
- 이메일 일회용 암호를 사용한 등록 및 로그인 흐름의 경우
["oob"]
를 사용합니다. - 이메일 및 암호를 사용한 등록 및 로그인 흐름의 경우
["oob","password"]
를 사용합니다. - SSPR(셀프 서비스 암호 재설정)의 경우
["oob"]
를 사용합니다.
챌린지 유형에 대해 자세히 알아봅니다.
선택 사항: 로깅 구성
SDK에서 로그를 출력할 수 있도록 로깅 콜백을 만들어 앱 생성 시 로깅을 활성화합니다.
import com.microsoft.identity.client.Logger
fun initialize(context: Context) {
Logger.getInstance().setExternalLogger { tag, logLevel, message, containsPII ->
Logs.append("$tag $logLevel $message")
}
}
로거를 구성하려면 구성 파일 auth_config_native_auth.json
에 섹션을 추가해야 합니다.
//...
{
"logging": {
"pii_enabled": false,
"log_level": "INFO",
"logcat_enabled": true
}
}
//...
- logcat_enabled: 라이브러리의 로깅 기능을 사용하도록 설정합니다.
- pii_enabled: 개인 데이터 또는 조직 데이터가 포함된 메시지를 로깅할지 여부를 지정합니다. false로 설정하면 로그에 개인 데이터가 포함되지 않습니다. true로 설정하면 로그에 개인 데이터가 포함될 수 있습니다.
- log_level: 사용하도록 설정할 로깅 수준을 결정하는 데 사용합니다. Android는 다음 로그 수준을 지원합니다.
- 오류
- WARNING
- INFO
- VERBOSE
MSAL 로깅에 대한 자세한 내용은 Android용 MSAL에서 로깅을 참조하세요.
네이티브 인증 MSAL SDK 인스턴스 만들기
onCreate()
메서드에서 앱이 네이티브 인증을 통해 테넌트에 대한 인증을 수행할 수 있도록 MSAL 인스턴스를 만듭니다. createNativeAuthPublicClientApplication()
메서드는 authClient
라는 인스턴스를 반환합니다. 이전에 만든 JSON 구성 파일을 매개 변수로 전달합니다.
//...
authClient = PublicClientApplication.createNativeAuthPublicClientApplication(
this,
R.raw.auth_config_native_auth
)
//...
코드는 다음 코드 조각과 유사하게 표시됩니다.
class MainActivity : AppCompatActivity() {
private lateinit var authClient: INativeAuthPublicClientApplication
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
authClient = PublicClientApplication.createNativeAuthPublicClientApplication(
this,
R.raw.auth_config_native_auth
)
getAccountState()
}
private fun getAccountState() {
CoroutineScope(Dispatchers.Main).launch {
val accountResult = authClient.getCurrentAccount()
when (accountResult) {
is GetAccountResult.AccountFound -> {
displaySignedInState(accountResult.resultValue)
}
is GetAccountResult.NoAccountFound -> {
displaySignedOutState()
}
}
}
}
private fun displaySignedInState(accountResult: AccountState) {
val accountName = accountResult.getAccount().username
val textView: TextView = findViewById(R.id.accountText)
textView.text = "Cached account found: $accountName"
}
private fun displaySignedOutState() {
val textView: TextView = findViewById(R.id.accountText)
textView.text = "No cached account found"
}
}
accountResult
개체를 반환하는getCurrentAccount()
를 사용하여 캐시된 계정을 검색합니다.- 지속성이 있는 계정이 발견되면
GetAccountResult.AccountFound
를 사용하여 로그인 상태를 표시합니다. - 그렇지 않으면
GetAccountResult.NoAccountFound
를 사용하여 로그아웃 상태를 표시합니다.
import 문을 포함했는지 확인합니다. Android Studio에는 import 문이 자동으로 포함되어야 합니다.