Tambahkan Masuk dengan Apple ke back-end

Di WWDC 2019, Apple memperkenalkan sistem otorisasi pengguna baru - Masuk dengan Apple. Ada tugas untuk mengintegrasikannya ke back-end kami dan menyinkronkannya dengan metode otorisasi yang ada menggunakan email, Google dan Facebook. Kolega kami, Kurenkoff, mengambil tugas itu, ia adalah penulis artikel ini. Mereka yang tertarik diminta di bawah kucing.

Registrasi dan prosedur otorisasi pengguna melalui Apple



Prosedurnya cukup primitif dan terjadi persis seperti yang ditunjukkan pada diagram dari Apple.

Selain itu, Apple menyediakan kemampuan untuk memperbarui token:



Skema ini juga cukup sederhana, dimungkinkan untuk memverifikasi token, tetapi kami tidak menggunakan fitur ini, karena kita tidak membutuhkannya.

Terapkan otorisasi melalui AppleID


Untuk menerapkan otorisasi melalui AppleID, kami menggunakan paket appleLogin . Penulis paket ini membuat beberapa kesalahan, tetapi mereka tidak kritis (dan beberapa diperbaiki bersama). Pertama-tama, Anda perlu menginisialisasi konfigurasi menggunakan data yang diterima melalui portal pengembang Apple.

config := appleLogin.InitAppleConfig( TeamID, // ID   developer.apple.com,   iOS  ClientID, // Bundle  iOS  callbackURI, //       KeyID, //     developer.apple.com,   iOS  ) privateKey := os.Getenv("PRIVATE_KEY") err := config.LoadP8CertByByte([]byte(privateKey)) if err != nil { return nil, err } 

Lalu dapatkan token:

 token, err := config.GetAppleToken(clientToken, tokenExpireTime) if err != nil { return nil, err } 

Penting untuk mencatat permintaan mana yang dikirim ke server Apple. Dokumentasi mengatakan bahwa untuk otorisasi perlu mengirim client_id, client_secret, kode, grant_type, bidang redirect_uri. Semua bidang ini dideskripsikan sebagai keharusan, tetapi redirect_uri dapat dihilangkan. Kesulitan utama adalah client_secret - ini adalah JWT yang ditandatangani oleh kunci yang dibuat di portal WWDR:

 token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims{ "iss": a.TeamID, "iat": time.Now().Unix(), "exp": time.Now().Unix() + expireTime, "aud": "https://appleid.apple.com", "sub": a.ClientID, }) token.Header = map[string]interface{}{ "kid": a.KeyID, "alg": "ES256", } tokenString, _ := token.SignedString(a.AESCert) 

Apple API akan merespons dengan kesalahan atau mengembalikan struktur. Kami tertarik pada bidang IDToken:

 type AppleAuthToken struct { AccessToken string json:"access_token" //AccessToken ExpiresIn int64 json:"expires_in" //Expires in IDToken string json:"id_token" //ID token RefreshToken string json:"refresh_token" //RF token TokenType string json:"token_type" //Token Type } 

IDToken adalah token JWT yang berisi data pengguna:

 type AppleUser struct { ID string json:"sub,omitempty" Email string json:"email,omitempty" EmailVerified bool json:"email_verified,string,omitempty" } 

Perlu memperhatikan fakta bahwa email hanya dapat diterima pada saat otorisasi pertama. Jika Anda mencoba untuk melakukan otorisasi ulang, Anda hanya bisa mendapatkan ID (pengidentifikasi pengguna unik di Masuk dengan Apple). Untuk mendaftarkan pengguna, kami membutuhkan cukup data ini.

Source: https://habr.com/ru/post/id470175/


All Articles