Anda dapat mengizinkan pengguna untuk melakukan autentikasi dengan Firebase menggunakan penyedia OAuth, seperti Yahoo, dengan mengintegrasikan Login OAuth umum ke aplikasi Anda menggunakan Firebase SDK agar alur login dapat dijalankan secara menyeluruh.
Sebelum memulai
Untuk membuat pengguna login menggunakan akun Yahoo, Anda harus terlebih dahulu mengaktifkan Yahoo sebagai penyedia login untuk project Firebase:
- Tambahkan Firebase ke project Apple.
- Di Firebase console, buka bagian Authentication.
- Pada tab Sign in method, aktifkan penyedia Yahoo.
- Tambahkan Client ID dan Client Secret dari konsol developer penyedia tersebut ke konfigurasi penyedia:
-
Untuk mendaftarkan klien OAuth Yahoo, baca dokumentasi developer Yahoo tentang mendaftarkan aplikasi web ke Yahoo.
Pastikan untuk memilih kedua izin OpenID Connect API:
profile
danemail
. - Saat mendaftarkan aplikasi ke penyedia ini, pastikan untuk mendaftarkan domain
*.firebaseapp.com
untuk project Anda sebagai domain pengalihan untuk aplikasi Anda.
-
- Klik Save.
Menangani alur login dengan Firebase SDK
Untuk menangani alur login dengan Firebase SDK untuk platform Apple, ikuti langkah-langkah berikut:
Tambahkan skema URL kustom ke project Xcode Anda:
- Buka konfigurasi project: klik dua kali pada nama project dalam tampilan hierarki di sebelah kiri. Pilih aplikasi dari bagian TARGETS, lalu pilih tab Info, dan perluas bagian URL Types.
- Klik tombol +, lalu tambahkan ID Aplikasi yang Di-enkode sebagai skema URL. Anda dapat menemukan ID Aplikasi yang Di-enkode pada halaman General Settings di Firebase console, di bagian aplikasi iOS. Biarkan kolom lainnya kosong.
Jika sudah selesai, konfigurasi akan terlihat seperti berikut (tapi dengan nilai khusus aplikasi Anda):
Buat instance OAuthProvider menggunakan ID penyedia yahoo.com.
Swift
var provider = OAuthProvider(providerID: "yahoo.com")
Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
Opsional: Tentukan parameter OAuth kustom tambahan yang ingin dikirim dengan permintaan OAuth.
Swift
provider.customParameters = [ "prompt": "login", "language": "fr" ]
Objective-C
[provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
Untuk parameter yang didukung Yahoo, baca dokumentasi OAuth Yahoo. Perlu diperhatikan bahwa Anda tidak dapat meneruskan parameter yang diperlukan Firebase dengan
setCustomParameters
. Parameter tersebut adalah client_id, redirect_uri, response_type, scope, dan state.Opsional: Tentukan cakupan OAuth 2.0 tambahan selain
profile
danemail
yang ingin diminta dari penyedia autentikasi. Jika aplikasi Anda memerlukan akses ke data pengguna pribadi dari Yahoo API, Anda harus meminta izin ke Yahoo API di bagian API Permissions di konsol developer Yahoo. Cakupan OAuth yang diminta harus sama persis dengan yang sudah dikonfigurasi sebelumnya dalam izin API aplikasi. Misalnya, jika permintaan akses baca/tulis diajukan ke kontak pengguna dan telah dikonfigurasi sebelumnya dalam izin API aplikasi,sdct-w
harus diteruskan sebagai ganti dari cakupan OAuth hanya bacasdct-r
. Jika tidak, alur akan gagal dan error akan ditampilkan kepada pengguna akhir.Swift
// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. provider.scopes = ["mail-r", "sdct-w"]
Objective-C
// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. [provider setScopes:@[@"mail-r", @"sdct-w"]];
Untuk mempelajari lebih lanjut, baca dokumentasi cakupan Yahoo.
Opsional: Jika Anda ingin menyesuaikan cara aplikasi menyajikan
SFSafariViewController
atauUIWebView
saat menampilkan reCAPTCHA kepada pengguna, buat class kustom yang sesuai dengan protokolAuthUIDelegate
, lalu teruskan kecredentialWithUIDelegate
.Lakukan autentikasi Firebase menggunakan objek penyedia OAuth.
Swift
provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken } } }
Objective-C
[provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
Dengan token akses OAuth, Anda dapat memanggil Yahoo API.
Misalnya, untuk mendapatkan informasi profil dasar, Anda dapat memanggil REST API yang meneruskan token akses di header
Authorization
:https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
YAHOO_USER_UID
adalah ID pengguna Yahoo yang dapat diambil dari kolomAuth.auth.currentUser.providerData[0].uid
atau dariauthResult.additionalUserInfo.profile
.Meskipun contoh di atas berfokus pada alur login, Anda juga dapat menautkan penyedia Yahoo ke pengguna yang ada menggunakan
linkWithPopup
. Misalnya, Anda dapat menautkan beberapa penyedia ke pengguna yang sama agar bisa login dengan salah satu penyedia tersebut.Swift
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
Objective-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Pola yang sama dapat digunakan dengan
reauthenticateWithPopup
/reauthenticateWithRedirect
, yang dapat digunakan untuk mengambil kredensial baru untuk operasi sensitif yang memerlukan login terbaru.Swift
Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
Objective-C
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Langkah berikutnya
Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan ditautkan ke kredensial, yaitu nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi, yang digunakan pengguna tersebut untuk login. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project, terlepas dari cara pengguna login.
-
Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari objek
User
. Baca bagian Mengelola Pengguna. Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik milik pengguna yang login dari variabel
auth
, dan menggunakannya untuk mengontrol data yang dapat diakses oleh pengguna.
Anda dapat mengizinkan pengguna untuk login ke aplikasi menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.
Agar pengguna logout, panggil signOut:
.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Anda juga dapat menambahkan kode penanganan error untuk berbagai error autentikasi. Lihat Menangani Error.