Halo, Habr!
Musim panas ini, pada konferensi WWDC 2019, Apple memperkenalkan sistem
Masuknya sendiri
dengan sistem otorisasi
Apple dan
mewajibkannya untuk semua aplikasi di App Store yang menggunakan login media sosial. Pengecualian adalah aplikasi pendidikan, perusahaan, pemerintah dan bisnis yang menggunakan otorisasi mereka sendiri. Untuk Masuk dengan Apple, Apple telah membuat
dokumentasi berkualitas tinggi, dan dalam artikel ini kami akan menggunakan contoh CIAN untuk menjelaskan cara menerapkannya dalam layanan kami.

Konfigurasikan Akun Pengembang Apple
Pekerjaan integrasi dimulai dengan menyiapkan akun pengembang. Pertama, Anda perlu mengaktifkan opsi Masuk dengan Apple untuk ID Aplikasi Anda. Untuk melakukan ini, buka
daftar pengidentifikasi di Akun Pengembang Apple , pilih ID Aplikasi yang diperlukan dan aktifkan opsi Masuk dengan Apple untuk itu.
Sekarang kami mengonfigurasi ID Layanan - pengidentifikasi unik untuk aplikasi web yang Anda perlukan untuk mengakses Masuk dengan Apple API. Secara total, hingga 5 ID Layanan dapat dibuat per ID Aplikasi. Untuk melakukan ini, klik tombol untuk membuat pengidentifikasi, pilih ID Layanan, isi bidang yang diperlukan dan klik Edit di bidang Masuk Dengan Apple. Formulir akan terbuka di mana kami memilih ID Aplikasi Utama yang benar, menentukan domain web, dan mencantumkan URL untuk pengalihan setelah login berhasil. Ingatlah bahwa Anda hanya dapat memasukkan 10 URL Pengembalian:

Untuk menyimpan, klik Simpan, Lanjutkan dan Daftar. Ya, untuk perubahan konfigurasi apa pun, Anda harus mengklik ketiga tombol, jika tidak perubahan tidak akan berpengaruh.
Sekarang, di daftar ID Layanan, pilih pengidentifikasi yang dibuat dan klik Edit lagi di bidang Masuk Dengan Apple. Di jendela yang terbuka, di sebelah bidang alamat web, kita melihat dua tombol baru:

File ini diperlukan untuk Apple untuk memverifikasi sumber Anda. Unduh dan letakkan di sumber Anda. Segera, tipuan ini tidak berhasil bagi kami: ketika admin kami menambahkan file, maka pengalihan (302) ke file yang terletak di tempat lain berfungsi pada url yang ditentukan, dan Apple tidak memverifikasinya. Kemudian saya harus meletakkan file untuk akses langsung dengan URL (200). Setelah Apple berhasil memeriksa file, tanda centang hijau di sebelah domain menyala:

Dari bagian pengidentifikasi, buka bagian Tombol dan buat kunci baru. Untuk melakukan ini, centang kotak Masuk dengan Apple dan klik Konfigurasi dulu untuk memeriksa ID Aplikasi, kemudian Lanjutkan:

Pada layar berikutnya, pastikan untuk mengunduh file dengan kunci dan menyimpannya di tempat yang aman, karena setelah meninggalkan layar ini kunci tidak akan tersedia untuk diunduh. Di halaman yang sama Anda dapat melihat ID Kunci, yang masih kami butuhkan:

Masuk dengan Apple memiliki bonus untuk pengguna: memungkinkan Anda memberikan email palsu, yang hanya bisa Anda tulis dari alamat tepercaya. Dalam hal ini, konfigurasi tambahan diperlukan. Buka bagian Lainnya, klik Konfigurasi di bagian Masuk dengan Apple dan masukkan URL Anda:

Tambahkan tombol Masuk dengan Apple ke aplikasi iOS.
CIAN bekerja pada tiga platform: iOS, Android, Web. Ada SDK asli untuk iOS, jadi otorisasi akan terlihat seperti ini:

Untuk menambahkan Masuk dengan Apple ke aplikasi iOS, tambahkan tombol ASAuthorizationAppleIDButton dan gantung handler klik di atasnya:
let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests()
Selain ASAuthorizationAppleIDProvider, perhatikan ASAuthorizationPasswordProvider, yang memungkinkan Anda untuk mendapatkan banyak "kata sandi masuk" dari Keychain.
Sekarang kami menerapkan ASAuthorizationControllerPresentationContextProviding:
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return self.view.window! }
Buat delegasi ASAuthorizationControllerDelegate yang melaporkan keberhasilan atau kesalahan:
public func authorizationController( controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization ) { guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential, let code = appleIDCredential.authorizationCode, let codeStr = String(data: code, encoding: .utf8) else {
Kami mengirim Kode otorisasi yang diterima ke server dan menunggu tanggapan dari backend tentang keberhasilan otorisasi dalam sistem kami.
Kami menerapkan Masuk dengan Apple untuk web dan Android
Tiba-tiba, untuk Android dan Web, Apple tidak menyediakan SDK, jadi dalam kedua kasus Anda perlu membuka halaman otorisasi Apple dan prosesnya akan berbeda:

URL untuk halaman login adalah sebagai berikut:
https:
Pertimbangkan parameternya:
- client_id - ID Layanan yang terdaftar di atas.
- redirect_uri - URI tempat pengguna dialihkan setelah otentikasi berhasil melalui AppleID. Kami menentukan URI ini di atas saat menyiapkan Pengembang Apple.
- state - pengidentifikasi sesi pengguna yang akan dikembalikan Apple ketika redirect_uri dipanggil sehingga kami dapat memeriksa pengirimnya. Anda dapat membuat aturan untuk menghasilkan parameter ini sendiri, misalnya, string acak.
- lingkup - parameter ini menunjukkan informasi apa yang dibutuhkan dari pengguna. Misalnya, nama, email, atau keduanya, seperti pada contoh di atas.
- response_type - parameter ini menunjukkan dalam bentuk apa respon diperlukan. Ini bisa berupa kode atau id_token. Jika Anda memilih id_token, maka Anda perlu menentukannya dengan parameter response_mode, di mana Anda dapat menentukan kueri, fragmen, dan form_post.
Setelah otentikasi dua faktor berhasil melalui appleID, Apple akan memanggil redirect_uri yang ditentukan dan meneruskan parameter status dan kode:
curl -X POST \ 'https:
Dalam parameter kode, kode otentikasi pengguna satu kali dilewatkan, yang berlaku selama 5 menit. Dalam parameter status, pengidentifikasi sesi dikirim saat formulir otorisasi dibuat, dan dalam parameter pengguna, data pengguna.
Pengambilan data
Pada semua klien, untuk menyimpan data pengguna, Anda perlu mendapatkan access_token dari Apple. Untuk melakukan ini, pertama minta otorisasi_kode:
curl -X POST https:
Dalam permintaan ini:
- client_id menunjukkan ServiceID yang dibuat untuk aplikasi web dan AppID untuk aplikasi iOS.
- kode - kami menerima lebih tinggi setelah pengalihan atau ditransfer dari klien iOS
- dalam parameter grant_type, kami meneruskan tujuan untuk mendapatkan token: otorisasi (authorization_code) atau pembaruan token (refresh_token)
- dalam parameter client_secret - Token Web JSON berdasarkan kunci rahasia yang diperoleh selama pendaftaran aplikasi.
Anda dapat membuat Token Web JSON dengan Python:
claims = { 'iss': APPLEID_TEAM_ID, 'aud': 'https://appleid.apple.com', 'sub': client_id, 'iat': current_timestamp, 'exp': current_timestamp + expire_period, } headers = {'kid': 'APPLEID_KEY_ID', 'alg': 'ES256'} client_secret = jwt.encode(payload=claims, key=secret_key, algorithm='ES256', headers=headers).decode('utf-8')
Jika semuanya berjalan dengan baik, parameter berikut akan muncul sebagai respons:
{ "access_token":"ufhzch", "token_type":"Bearer", "expires_in":3600, "refresh_token":"some_refresh_token", "id_token":"some_long_signed_jwt_token" }
Hore, di sini adalah access_token. Bersamaan dengan itu hadir refresh_token, yang dapat diperbarui jika perlu access_token.
Informasi pengguna disimpan di bidang id_token, tetapi harus diterjemahkan:
public_key = jwt.algorithms.RSAAlgorithm.from_jwk( json.dumps(apple_public_key) ) data = jwt.decode( id_token, public_key, algorithm="RS256", verify=True, audience=client_id, )
Apple_public_key adalah kunci publik yang dapat diperoleh dari
tautan.Setelah decoding kita dapatkan:
data = { "iss": "https://appleid.apple.com", "aud": client_id, "exp": 1570379521, "iat": 1570378921, "sub": " ", "at_hash": "8ZDF6j786IQf9mA", "email": "someemail@gmail.com", "email_verified": "true", "auth_time": 1570378804 }
Email ditransmisikan hanya sekali ketika pengguna pertama kali masuk ke layanan Anda melalui Masuk dengan Apple. Lain kali, Apple akan mentransfer data ini hanya jika pengguna melepaskan ikatan aplikasi Anda sendiri. Otorisasi dari Apple ini berbeda dari layanan lain di mana data dapat diperoleh melalui API, dan kami tidak menemukan informasi yang mereka rencanakan untuk mengimplementasikan sesuatu seperti itu.
Dalam jawaban ini, kita perlu sub parameter, yang dikirimkan setiap waktu, dan email, jadi kami menyimpannya di sistem kami dan memberi tahu klien tentang keberhasilan otorisasi. KEUNTUNGAN.
Hasil pertama
Setelah merilis versi baru CIAN dengan Masuk dengan Apple, pada hari pertama hari itu menyumbang sepertiga dari pendaftaran baru untuk iOS 13, dan sekarang menempati posisi kedua untuk semua versi iOS, kedua setelah VK. Ada beberapa pendaftaran di situs menggunakan AppleID, tetapi jumlahnya perlahan-lahan bertambah. Dan sekarang kami memiliki rencana untuk mengaktifkan otorisasi melalui AppleID pada aplikasi Android, dan melihat berapa banyak pengguna yang mendaftar dengan cara yang rumit.