Azure AD B2C kullanarak kendi Android uygulamanızda kimlik doğrulamasını etkinleştirme

Bu makalede, kendi Android mobil uygulamanıza Azure Active Directory B2C (Azure AD B2C) kimlik doğrulaması ekleme adımları gösterilmektedir.

Örnek Android uygulamasını kendi Android uygulamanızla değiştirerek Azure AD B2C kullanarak örnek bir Android uygulamasında kimlik doğrulamasını yapılandırma ile bu makaleyi kullanın. Bu makaledeki yönergeleri tamamladıktan sonra uygulamanız Azure AD B2C aracılığıyla oturum açmayı kabul edecektir.

Önkoşullar

Azure AD B2C kullanarak örnek bir Android uygulamasında kimlik doğrulamasını yapılandırma başlığındaki önkoşulları ve tümleştirme yönergelerini gözden geçirin.

Android uygulama projesi oluşturma

Henüz bir Android uygulamanız yoksa, aşağıdakileri yaparak yeni bir proje ayarlayın:

  1. Android Studio'da Yeni bir Android Studio projesi başlat'ı seçin.
  2. Temel Etkinlik'i ve ardından İleri'yi seçin.
  3. Uygulamanızı adlandırın.
  4. Paket adını kaydedin. Bunu daha sonra Azure portalında girersiniz.
  5. Dili Kotlin'den Java'ya değiştirin.
  6. En Düşük API düzeyini API 19 veya üzeri olarak ayarlayın ve ardından Son'u seçin.
  7. Proje görünümünde, kaynak ve kaynak olmayan proje dosyalarını görüntülemek için açılan listeden Project'i seçin, app/build.gradle dosyasını açın ve targetSdkVersion değerini 28 olarak ayarlayın.

1. Adım: Bağımlılıkları yükleme

Android Studio proje penceresinde build.gradle uygulamasına >gidin ve aşağıdakileri ekleyin:

apply plugin: 'com.android.application'

allprojects {
    repositories {
    mavenCentral()
    google()
    mavenLocal()
    maven {
        url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
    }
    maven {
        name "vsts-maven-adal-android"
        url "https://identitydivision.pkgs.visualstudio.com/_packaging/AndroidADAL/maven/v1"
        credentials {
            username System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") : project.findProperty("vstsUsername")
            password System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") : project.findProperty("vstsMavenAccessToken")
        }
    }
    jcenter()
    }
}
dependencies{
    implementation 'com.microsoft.identity.client:msal:2.+'
    }
packagingOptions{
    exclude("META-INF/jersey-module-version")
}

2. Adım: Kimlik doğrulama bileşenlerini ekleme

Örnek kod aşağıdaki bileşenlerden oluşur. Bu bileşenleri örnek Android uygulamasından kendi uygulamanıza ekleyin.

Bileşen Tür Source Tanım
B2CUser Sınıf KotlinJava B2C kullanıcılarını temsil eder. Bu sınıf, kullanıcıların birden çok ilkeyle oturum açmasına olanak tanır.
B2CModeFragment Fragment sınıfı KotlinJava Parça, ana etkinliğinizdeki Azure AD B2C kullanıcı arabirimiyle oturum açma işleminin modüler bir bölümünü temsil eder. Bu parça, kimlik doğrulama kodunun çoğunu içerir.
fragment_b2c_mode.xml Parça düzeni KotlinJava B2CModeFragment parça bileşeni için bir kullanıcı arabiriminin yapısını tanımlar.
B2CConfiguration Sınıf KotlinJava Yapılandırma dosyası, Azure AD B2C kimlik sağlayıcınız hakkında bilgi içerir. Mobil uygulama, Azure AD B2C ile güven ilişkisi kurmak, kullanıcıların oturumunu açıp kapatmak, belirteçleri almak ve bunları doğrulamak için bu bilgileri kullanır. Daha fazla yapılandırma ayarı için auth_config_b2c.json dosyasına bakın.
auth_config_b2c.json JSON dosyası KotlinJava Yapılandırma dosyası, Azure AD B2C kimlik sağlayıcınız hakkında bilgi içerir. Mobil uygulama, Azure AD B2C ile güven ilişkisi kurmak, kullanıcıların oturumunu açıp kapatmak, belirteçleri almak ve bunları doğrulamak için bu bilgileri kullanır. Daha fazla yapılandırma ayarı için bkz. B2CConfiguration sınıfı.

3. Adım: Android uygulamanızı yapılandırma

Kimlik doğrulama bileşenlerini ekledikten sonra, Android uygulamanızı Azure AD B2C ayarlarınız ile yapılandırın. Azure AD B2C kimlik sağlayıcısı ayarları auth_config_b2c.json dosyasında ve B2CConfiguration sınıfında yapılandırılır.

Yönergeler için bkz . Örnek mobil uygulamayı yapılandırma.

4. Adım: Yeniden yönlendirme URI'sini ayarlama

Uygulamanızın Azure AD B2C belirteci yanıtını dinlediği yeri yapılandırın.

  1. Yeni bir geliştirme imzası karması oluşturun. Bu, her geliştirme ortamı için değişir.

    Windows için:

    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
    

    iOS için:

    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
    

    Üretim ortamı için aşağıdaki komutu kullanın:

    keytool -exportcert -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE | openssl sha1 -binary | openssl base64
    

    Uygulamalarınızı imzalama konusunda daha fazla yardım için bkz . Android uygulamanızı imzalama.

  2. app>src>main>AndroidManifest.xml öğesini seçin ve ardından aşağıdaki BrowserTabActivity etkinliği uygulama gövdesine ekleyin:

    <!--Intent filter to capture System Browser or Authenticator calling back to our app after sign-in-->
    <activity
        android:name="com.microsoft.identity.client.BrowserTabActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="msauth"
                android:host="Package_Name"
                android:path="/Signature_Hash" />
        </intent-filter>
    </activity>
    
  3. değerini oluşturduğunuz karma değerle değiştirin Signature_Hash .

  4. değerini Android paketinizin adıyla değiştirin Package_Name .

Mobil uygulama kaydını uygulama yeniden yönlendirme URI'nizle güncelleştirmek için aşağıdakileri yapın:

  1. Azure Portal oturum açın.
  2. Birden çok kiracıya erişiminiz varsa, Dizinler + abonelikler menüsünden Azure AD B2C kiracınıza geçmek için üstteki menüden Ayarlar simgesini seçin.
  3. Azure AD B2C'yi arayıp seçin.
  4. Uygulama kayıtları'yi seçin ve ardından 2.3. Adım: Mobil uygulamayı kaydetme bölümünde kaydettiğiniz uygulamayı seçin.
  5. Kimlik doğrulaması'nı seçin.
  6. Android'in altında URI ekle'yi seçin.
  7. Paket adı ve İmza karması girin.
  8. Kaydet'i seçin.

Yeniden yönlendirme URI'niz BrowserTabActivity ve etkinliğiniz aşağıdaki örneğe benzer olmalıdır:

Örnek Android için yeniden yönlendirme URL'si şöyle görünür:

msauth://com.azuresamples.msalandroidkotlinapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D

Amaç filtresi, aşağıdaki XML kod parçacığında gösterildiği gibi aynı deseni kullanır:

<activity android:name="com.microsoft.identity.client.BrowserTabActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="com.azuresamples.msalandroidkotlinapp"
            android:path="/1wIqXSqBj7w+h11ZifsnqwgyKrY="
            android:scheme="msauth" />
    </intent-filter>
</activity>

5. Adım: Kod yapı taşlarınızı özelleştirme

Bu bölümde, Android uygulamanız için kimlik doğrulamasını etkinleştiren kod yapı taşları açıklanmaktadır. Aşağıdaki tabloda B2CModeFragment yöntemleri ve kodunuzun nasıl özelleştirileceği listelenir.

5.1. Adım: Genel istemci uygulaması örneği oluşturma

Genel istemci uygulamalarının uygulama gizli dizilerini güvenli bir şekilde saklamasına güvenilmez ve istemci gizli dizileri yoktur. onCreate veya onCreateView içinde, birden çok hesaplı genel istemci uygulama nesnesini kullanarak MSAL örneği oluşturun.

sınıfı MultipleAccountPublicClientApplication , birden çok hesabın aynı anda oturum açmasına olanak sağlayan MSAL tabanlı uygulamalar oluşturmak için kullanılır. sınıfı, birden çok Azure AD B2C kullanıcı akışı veya özel ilke ile oturum açmaya izin verir. Örneğin, kullanıcılar bir kaydolma veya oturum açma kullanıcı akışıyla oturum açar ve daha sonra bir düzenleme profili kullanıcı akışı çalıştırır.

Aşağıdaki kod parçacığında, yapılandırma JSON dosyasıyla MSAL kitaplığının auth_config_b2c.json nasıl başlatıldığı gösterilmektedir.

PublicClientApplication.createMultipleAccountPublicClientApplication(context!!,
    R.raw.auth_config_b2c,
    object : IMultipleAccountApplicationCreatedListener {
        override fun onCreated(application: IMultipleAccountPublicClientApplication) {
            // Set the MultipleAccountPublicClientApplication to the class member b2cApp
            b2cApp = application
            // Load the account (if there is any)
            loadAccounts()
        }

        override fun onError(exception: MsalException) {
            // Error handling
            displayError(exception)
        }
    })

5.2. Adım: Hesapları yükleme

Uygulama ön plana geldiğinde uygulama, kullanıcıların oturum açıp açmadığını belirlemek için mevcut hesabı yükler. Kullanıcı arabirimini kimlik doğrulama durumuyla güncelleştirmek için bu yöntemi kullanın. Örneğin, oturumu kapatma düğmesini etkinleştirebilir veya devre dışı bırakabilirsiniz.

Aşağıdaki kod parçacığında hesapların nasıl yüklenecekleri gösterilmektedir.

private fun loadAccounts() {
    if (b2cApp == null) {
        return
    }
    b2cApp!!.getAccounts(object : LoadAccountsCallback {
        override fun onTaskCompleted(result: List<IAccount>) {
            users = B2CUser.getB2CUsersFromAccountList(result)
            updateUI(users)
        }
    
        override fun onError(exception: MsalException) {
            displayError(exception)
        }
    })
    }

5.3. Adım: Etkileşimli yetkilendirme isteği başlatma

Etkileşimli yetkilendirme isteği, kullanıcıların kaydolması veya oturum açması istendiği bir akıştır. initializeUI yöntemi tıklama olayını yapılandırıyorrunUserFlowButton. Kullanıcılar Kullanıcı Akışını Çalıştır düğmesini seçtiğinde, uygulama oturum açma akışını tamamlamak için bu kişileri Azure AD B2C'ye götürür.

yöntemi, runUserFlowButton.setOnClickListener yetkilendirme isteğiyle ilgili verilerle nesnesini hazırlar AcquireTokenParameters . Yöntemi acquireToken daha sonra kullanıcılardan kaydolma veya oturum açma akışını tamamlamalarını ister.

Aşağıdaki kod parçacığı etkileşimli yetkilendirme isteğini nasıl başlatacaklarını gösterir:

val parameters = AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(activity)
        .fromAuthority(getAuthorityFromPolicyName(policy_list.getSelectedItem().toString()))
        .withScopes(B2CConfiguration.scopes)
        .withPrompt(Prompt.LOGIN)
        .withCallback(authInteractiveCallback)
        .build()

b2cApp!!.acquireToken(parameters)

5.4. Adım: Etkileşimli yetkilendirme isteği geri çağırması yapma

Kullanıcılar yetkilendirme akışını tamamladıktan sonra(başarılı veya başarısız) sonuç geri çağırma yöntemine getAuthInteractiveCallback() döndürülür.

Geri çağırma yöntemi nesneyi veya nesnede MsalException bir hata iletisini geçirirAuthenticationResult. Şu yöntemi kullanarak:

  • Oturum açma işlemi tamamlandıktan sonra mobil uygulama kullanıcı arabirimini bilgilerle güncelleştirin.
  • Accounts nesnesini yeniden yükleyin.
  • Erişim belirteci ile bir web API'si hizmetini çağırın.
  • Kimlik doğrulama hatalarını işleme.

Aşağıdaki kod parçacığı, etkileşimli kimlik doğrulaması geri çağırmanın kullanımını gösterir.

private val authInteractiveCallback: AuthenticationCallback
    private get() = object : AuthenticationCallback {
        override fun onSuccess(authenticationResult: IAuthenticationResult) {
            /* Successfully got a token, use it to call a protected resource; web API  */
            Log.d(TAG, "Successfully authenticated")

            /* display result info */
            displayResult(authenticationResult)

            /* Reload account asynchronously to get the up-to-date list. */
            loadAccounts()
        }

        override fun onError(exception: MsalException) {
            val B2C_PASSWORD_CHANGE = "AADB2C90118"
            if (exception.message!!.contains(B2C_PASSWORD_CHANGE)) {
                txt_log!!.text = """
                    Users click the 'Forgot Password' link in a sign-up or sign-in user flow.
                    Your application needs to handle this error code by running a specific user flow that resets the password.
                    """.trimIndent()
                return
            }

            /* Failed to acquireToken */Log.d(TAG, "Authentication failed: $exception")
            displayError(exception)
            if (exception is MsalClientException) {
                /* Exception inside MSAL, more info inside MsalError.java */
            } else if (exception is MsalServiceException) {
                /* Exception when communicating with the STS, likely config issue */
            }
        }

        override fun onCancel() {
            /* User canceled the authentication */
            Log.d(TAG, "User cancelled login.")
        }
    }

6. Adım: Web API'si çağırma

Belirteç tabanlı yetkilendirme web API'sini çağırmak için uygulamanın geçerli bir erişim belirtecine sahip olması gerekir. Uygulama aşağıdakileri yapar:

  1. Web API uç noktası için gerekli izinlere (kapsamlara) sahip bir erişim belirteci alır.
  2. Erişim belirtecini http isteğinin yetkilendirme üst bilgisinde taşıyıcı belirteç olarak şu biçimi kullanarak geçirir:
Authorization: Bearer <access-token>

Kullanıcılar etkileşimli olarak oturum açarken, uygulama geri çağırma yönteminde getAuthInteractiveCallback bir erişim belirteci alır. Ardışık web API çağrıları için bu bölümde açıklandığı gibi alma belirteci sessiz yordamını kullanın.

Bir web API'sini acquireTokenSilentAsync çağırmadan önce, web API uç noktanız için uygun kapsamlarla yöntemini çağırın. MSAL kitaplığı aşağıdakileri yapar:

  1. belirteç önbelleğinden istenen kapsamlara sahip bir erişim belirteci getirmeye çalışır. Belirteç varsa, belirteç döndürülür.
  2. Belirteç belirteç önbelleğinde yoksa, MSAL yeni bir belirteç almak için yenileme belirtecini kullanmayı dener.
  3. Yenileme belirteci yoksa veya süresi dolduysa, bir özel durum döndürülür. Kullanıcıdan etkileşimli olarak oturum açmasını istemenizi öneririz.

Aşağıdaki kod parçacığı erişim belirtecinin nasıl alınduğunu gösterir:

Düğme acquireTokenSilentButton tıklama olayı, sağlanan kapsamlara sahip bir erişim belirteci alır.

btn_acquireTokenSilently.setOnClickListener(View.OnClickListener {
    if (b2cApp == null) {
        return@OnClickListener
    }
    val selectedUser = users!![user_list.getSelectedItemPosition()]
    selectedUser.acquireTokenSilentAsync(b2cApp!!,
            policy_list.getSelectedItem().toString(),
            B2CConfiguration.scopes,
            authSilentCallback)
})

authSilentCallback Geri çağırma yöntemi bir erişim belirteci döndürür ve bir web API'sini çağırır:

private val authSilentCallback: SilentAuthenticationCallback
    private get() = object : SilentAuthenticationCallback {
        override fun onSuccess(authenticationResult: IAuthenticationResult) {
            Log.d(TAG, "Successfully authenticated")

            /* Call your web API here*/
            callWebAPI(authenticationResult)
        }

        override fun onError(exception: MsalException) {
            /* Failed to acquireToken */
            Log.d(TAG, "Authentication failed: $exception")
            displayError(exception)
            if (exception is MsalClientException) {
                /* Exception inside MSAL, more info inside MsalError.java */
            } else if (exception is MsalServiceException) {
                /* Exception when communicating with the STS, likely config issue */
            } else if (exception is MsalUiRequiredException) {
                /* Tokens expired or no session, retry with interactive */
            }
        }
    }

Aşağıdaki örnek, taşıyıcı belirteci ile korumalı bir web API'sinin nasıl çağrılduğunu gösterir:

@Throws(java.lang.Exception::class)
private fun callWebAPI(authenticationResult: IAuthenticationResult) {
    val accessToken = authenticationResult.accessToken
    val thread = Thread {
        try {
            val url = URL("https://your-app-service.azurewebsites.net/helo")
            val conn = url.openConnection() as HttpsURLConnection
            conn.setRequestProperty("Accept", "application/json")
            
            // Set the bearer token
            conn.setRequestProperty("Authorization", "Bearer $accessToken")
            if (conn.responseCode == HttpURLConnection.HTTP_OK) {
                val br = BufferedReader(InputStreamReader(conn.inputStream))
                var strCurrentLine: String?
                while (br.readLine().also { strCurrentLine = it } != null) {
                    Log.d(TAG, strCurrentLine)
                }
            }
            conn.disconnect()
        } catch (e: IOException) {
            e.printStackTrace()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    thread.start()
}

Ağ işlemlerini gerçekleştirmek için izin ekleme

Uygulamanızda ağ işlemleri gerçekleştirmek için bildiriminize aşağıdaki izni ekleyin. Daha fazla bilgi için bkz. ağa Bağlan.

<uses-permission android:name="android.permission.INTERNET"/>

Sonraki adımlar

Şunları nasıl yapacağınızı öğrenin: