チュートリアル: ネイティブ認証用に Android モバイル アプリを準備する
このチュートリアルでは、Microsoft Authentication Library (MSAL) ネイティブ認証 SDK を Android モバイル アプリに追加する方法について説明します。
このチュートリアルでは、次の作業を行う方法について説明します。
- 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
」と入力し、[OK] を選択します。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 では、次のログ レベルがサポートされています。
- ERROR
- WARNING
- INFO
- 詳細
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 ステートメントが含められます。