Mengonfigurasi App Service atau aplikasi Azure Functions Anda untuk masuk menggunakan Masuk dengan penyedia Apple (Pratinjau)

Artikel ini menunjukkan cara mengonfigurasi Azure App Service atau Azure Functions untuk menggunakan Masuk dengan Apple sebagai penyedia autentikasi.

Untuk menyelesaikan prosedur dalam artikel ini, Anda harus terdaftar di program pengembang Apple. Untuk mendaftar di program pengembang Apple, buka developer.apple.com/programs/enroll.

Perhatian

Mengaktifkan Masuk dengan Apple akan menonaktifkan manajemen fitur Otorisasi/Autentikasi App Service untuk aplikasi Anda melalui beberapa klien, seperti portal Azure, Azure CLI, dan Azure PowerShell. Fitur tersebut bergantung pada permukaan API baru yang, selama pratinjau, belum diperhitungkan dalam semua pengalaman manajemen.

Membuat aplikasi di portal Pengembang Apple

Anda harus membuat ID Aplikasi dan ID layanan di portal Apple Developer.

  1. Di portal Apple Developer, buka Sertifikat, Pengidentifikasi, & Profil.
  2. Pada tab Pengidentifikasi, pilih tombol (+).
  3. Pada halaman Daftarkan Pengidentifikasi Baru, pilih ID Aplikasi dan pilih Lanjutkan. (ID Aplikasi menyertakan satu atau beberapa ID Layanan.) Registering a new app identifier in the Apple Developer Portal
  4. Pada halaman Daftarkan ID Aplikasi, berikan deskripsi dan ID bundel, dan pilih Masuk dengan Apple dari daftar kemampuan. Lalu Pilih Lanjutkan. Catat Awalan ID Aplikasi (ID Tim) Anda dari langkah ini, Anda akan membutuhkannya nanti. Configuring a new app identifier in the Apple Developer Portal
  5. Ulas informasi pendaftaran aplikasi dan pilih Daftar.
  6. Sekali lagi, pada tab Pengidentifikasi, pilih tombol (+). Creating a new service identifier in the Apple Developer Portal
  7. Pada halaman Daftarkan Pengidentifikasi Baru, pilih ID Layanan dan pilih Lanjutkan. Registering a new service identifier in the Apple Developer Portal
  8. Pada halaman Daftarkan ID Layanan, berikan deskripsi dan pengidentifikasi. Deskripsi adalah apa yang akan ditampilkan kepada pengguna di layar persetujuan. Pengidentifikasi akan menjadi ID klien Anda yang digunakan dalam mengonfigurasi penyedia Apple dengan layanan aplikasi Anda. Lalu pilih Konfigurasikan. Providing a description and an identifier
  9. Pada jendela pop-up, atur ID Aplikasi Utama ke ID Aplikasi yang Anda buat sebelumnya. Tentukan domain aplikasi Anda di bagian domain. Untuk URL kembali, gunakan URL <app-url>/.auth/login/apple/callback. Contohnya, https://contoso.azurewebsites.net/.auth/login/apple/callback. Lalu pilih Tambahkan dan Simpan. Specifying the domain and return URL for the registration
  10. Ulas informasi pendaftaran layanan dan pilih Simpan.

Membuat rahasia klien

Apple mengharuskan pengembang aplikasi untuk membuat dan menandatangani token JWT sebagai nilai rahasia klien. Untuk membuat rahasia ini, pertama-tama buat dan unduh kunci privat kurva eliptik dari portal Apple Developer. Lalu, gunakan kunci tersebut untuk menandatangani JWT dengan payload tertentu.

Membuat dan mengunduh kunci privat

  1. Pada tab Kunci di portal Apple Developer, pilih Buat kunci atau pilih tombol (+).
  2. Pada halaman Daftarkan Kunci Baru, beri nama pada kunci tersebut, centang kotak di samping Masuk dengan Apple dan pilih Konfigurasikan.
  3. Pada halaman Konfigurasikan Kunci, tautkan kunci ke ID aplikasi utama yang Anda buat sebelumnya dan pilih Simpan.
  4. Selesaikan pembuatan kunci dengan mengonfirmasi informasi dan memilih Lanjutkan, lalu mengulas informasi tersebut dan memilih Daftar.
  5. Pada halaman Unduh Kunci Anda, unduh kuncinya. Kunci akan diunduh sebagai file .p8 (PKCS #8) - Anda akan menggunakan isi file tersebut untuk menandatangani JWT rahasia klien Anda.

Menyusun JWT rahasia klien

Apple mengharuskan rahasia klien menjadi pengodean base64 dari token JWT. Token JWT yang didekodekan harus memiliki payload yang terstruktur seperti contoh ini:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: ID Klien Apple (juga ID layanan)
  • iss: ID Tim Apple Developer Anda
  • aud: Apple menerima token, jadi Apple adalah audiensnya
  • exp: Tidak lebih dari enam bulan setelah nbf

Versi payload di atas yang dikodekan base64 terlihat seperti ini: eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Catatan: Apple tidak menerima JWT rahasia klien dengan tanggal kedaluwarsa lebih dari enam bulan setelah tanggal pembuatan (atau nbf). Itu berarti Anda harus merotasi rahasia klien Anda, minimal, setiap enam bulan.

Informasi selengkapnya tentang membuat dan memvalidasi token dapat ditemukan di dokumentasi pengembang Apple.

Menandatangani JWT rahasia klien

Anda akan menggunakan file .p8 yang Anda unduh sebelumnya untuk menandatangani JWT rahasia klien. File ini adalah file PCKS#8 yang berisi kunci penandatanganan privat dalam format PEM. Ada banyak pustaka yang dapat membuat dan menandatangani JWT untuk Anda.

Ada berbagai jenis pustaka sumber terbuka yang tersedia online untuk membuat dan menandatangani token JWT. Untuk informasi selengkapnya tentang membuat token JWT, lihat JSON Web Token (JWT). Misalnya, salah satu cara membuat rahasia klien adalah dengan mengimpor paket NuGet Microsoft.IdentityModel.Tokens dan menjalankan sejumlah kecil kode C# yang ditunjukkan di bawah ini.

using Microsoft.IdentityModel.Tokens;

public static string GetAppleClientSecret(string teamId, string clientId, string keyId, string p8key)
{
    string audience = "https://appleid.apple.com";

    string issuer = teamId;
    string subject = clientId;
    string kid = keyId;

    IList<Claim> claims = new List<Claim> {
        new Claim ("sub", subject)
    };

    CngKey cngKey = CngKey.Import(Convert.FromBase64String(p8key), CngKeyBlobFormat.Pkcs8PrivateBlob);

    SigningCredentials signingCred = new SigningCredentials(
        new ECDsaSecurityKey(new ECDsaCng(cngKey)),
        SecurityAlgorithms.EcdsaSha256
    );

    JwtSecurityToken token = new JwtSecurityToken(
        issuer,
        audience,
        claims,
        DateTime.Now,
        DateTime.Now.AddDays(180),
        signingCred
    );
    token.Header.Add("kid", kid);
    token.Header.Remove("typ");

    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

    return tokenHandler.WriteToken(token);
}
  • teamId: ID Tim Apple Developer Anda
  • clientId: ID Klien Apple (juga ID layanan)
  • p8key: Kunci format PEM - Anda dapat memperoleh kunci dengan membuka file .p8 dalam editor teks, dan menyalin semuanya antara -----BEGIN PRIVATE KEY----- dan -----END PRIVATE KEY----- tanpa jeda baris
  • keyId: ID kunci yang diunduh

Token yang dikembalikan ini adalah nilai rahasia klien yang akan Anda gunakan untuk mengonfigurasi penyedia Apple.

Penting

Rahasia klien adalah info masuk keamanan yang penting. Jangan berbagi rahasia ini dengan siapa pun atau mendistribusikannya dalam aplikasi klien.

Tambahkan rahasia klien sebagai pengaturan aplikasi untuk aplikasi, menggunakan nama pengaturan pilihan Anda. Catat nama ini untuk nanti.

Menambahkan informasi penyedia ke aplikasi Anda

Catatan

Konfigurasi yang diperlukan dalam format API baru, saat ini hanya didukung oleh konfigurasi berbasis file (pratinjau). Anda harus mengikuti langkah-langkah di bawah ini menggunakan file tersebut.

Bagian ini akan memandu Anda memperbarui konfigurasi untuk menyertakan IDP baru Anda. Contoh konfigurasi sebagai berikut.

  1. Di dalam objek identityProviders, tambahkan objek apple jika objek belum ada.

  2. Tetapkan objek ke kunci tersebut dengan objek registration di dalamnya, dan secara opsional objek login:

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    

    a. Dalam objek registration, atur clientId ke ID klien yang Anda kumpulkan.

    b. Di dalam objek registration, atur clientSecretSettingName ke nama pengaturan aplikasi tempat Anda menyimpan rahasia klien.

    c. Dalam objek login, Anda dapat memilih untuk mengatur array scopes untuk menyertakan daftar cakupan yang digunakan saat mengautentikasi dengan Apple, seperti "nama" dan "email". Jika cakupan dikonfigurasi, cakupan tersebut akan diminta secara eksplisit di layar persetujuan saat pengguna masuk untuk pertama kalinya.

Setelah konfigurasi ini diatur, Anda siap menggunakan penyedia Apple untuk autentikasi di aplikasi Anda.

Konfigurasi lengkap mungkin terlihat seperti contoh berikut (dengan pengaturan APPLE_GENERATED_CLIENT_SECRET menunjuk ke pengaturan aplikasi yang berisi JWT yang dibuat):

{
    "platform": {
        "enabled": true
    },
    "globalValidation": {
        "redirectToProvider": "apple",
        "unauthenticatedClientAction": "RedirectToLoginPage"
    },
    "identityProviders": {
        "apple": {
            "registration": {
                "clientId": "com.contoso.example.client",
                "clientSecretSettingName": "APPLE_GENERATED_CLIENT_SECRET"
            },
            "login": {
                "scopes": []
            }
        }
    },
    "login": {
        "tokenStore": {
            "enabled": true
        }
    }     
}

Langkah berikutnya