āĻāύā§āĻĄ-āĻā§-āĻāύā§āĻĄ OAuth 2.0 āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ Apple ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāύ āĻāϰāϤā§, āĻĒā§āϰāĻĨāĻŽā§ Apple āĻāϰ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āϏāĻžāĻāĻā§ Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ Apple āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
āĻ ā§āϝāĻžāĻĒāϞ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āϝā§āĻ āĻĻāĻŋāύ
Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Apple āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻĻāϏā§āϝāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§ā§ˇ
āĻ ā§āϝāĻžāĻĒāϞ āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ
āĻāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻā§āĻā§āĻā§ Apple āϏāĻžāĻāύ āĻāύ āĻ āĻŦāĻļā§āϝāĻ āϏāĻā§āώāĻŽ āĻāĻŦāĻ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻāĻŦāĻļā§āϝāĻāĨ¤ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻāĻŦāĻ āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻā§āĻĄāĻŧā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋāϝāĻŧā§ āϝāĻžāĻāϝāĻŧāĻžāϰ āĻāĻā§ āĻ āύā§āĻā§āϰāĻš āĻāϰ⧠āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻāĻŦāĻ/āĻ āĻĨāĻŦāĻž āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻāĻžāĻāĻĄā§āϰ "āĻ ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ" āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύāĨ¤āĻāĻāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ Apple āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
- Firebase āĻāύāϏā§āϞ⧠, Auth āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤ āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏāĻā§āώāĻŽ āĻāϰā§āύāĨ¤
- āĻ
ā§āϝāĻžāĻĒāϞ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏā§āĻāĻŋāĻāϏ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ:
- āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āϏāĻžāϰā§āĻāĻŋāϏ āĻāĻāĻĄāĻŋ, āĻ ā§āϝāĻžāĻĒāϞ āĻāĻŋāĻŽ āĻāĻāĻĄāĻŋ, āĻĒā§āϰāĻžāĻāĻā§āĻ āĻā§ āĻāĻŦāĻ āĻā§ āĻāĻāĻĄāĻŋ āĻā§āώā§āϤā§āϰāĻā§āϞāĻŋ āĻāĻžāϞāĻŋ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
- āĻ
ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄ āĻĄāĻŋāĻāĻžāĻāϏ⧠āϏāĻŽāϰā§āĻĨāύā§āϰ āĻāύā§āϝ:
- āĻāĻĒāύāĻžāϰ Android āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĨ¤ Firebase āĻāύāϏā§āϞ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āϏā§āĻ āĻāĻĒ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ SHA-1 āϏā§āĻŦāĻžāĻā§āώāϰ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻžāĨ¤
- Firebase āĻāύāϏā§āϞ⧠, Auth āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤ āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏāĻā§āώāĻŽ āĻāϰā§āύāĨ¤ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻŋ āϝ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāĻāĻĄāĻŋ āϤā§āϰāĻŋ āĻāϰā§āĻā§āύ āϤāĻž āĻāϞā§āϞā§āĻ āĻāϰā§āύāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, OAuth āĻā§āĻĄ āĻĢā§āϞ⧠āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦāĻŋāĻāĻžāĻā§, āĻāĻĒāύāĻžāϰ Apple āĻāĻŋāĻŽ āĻāĻāĻĄāĻŋ āĻāĻŦāĻ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻžāϰ āϤā§āϰāĻŋ āĻāϰāĻž āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻā§ āĻāĻŦāĻ āĻā§ āĻāĻāĻĄāĻŋ āĻāϞā§āϞā§āĻ āĻāϰā§āύāĨ¤
āĻ ā§āϝāĻžāĻĒāϞ āĻŦā§āύāĻžāĻŽā§ āĻĄā§āĻāĻž āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻŽā§āύ⧠āĻāϞā§āύ
āĻ
ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϏāĻš āϤāĻžāĻĻā§āϰ āĻĄā§āĻāĻž āĻŦā§āύāĻžāĻŽā§ āĻāϰāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒ āĻĻā§āϝāĻŧ⧎ āϝ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāĻ āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āĻŦā§āĻā§ āύā§āύ āϤāĻžāĻĻā§āϰ āĻāĻžāĻā§ privaterelay.appleid.com
āĻĄā§āĻŽā§āύā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϰāϝāĻŧā§āĻā§ā§ˇ āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§ Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻāύ āĻāĻĒāύāĻžāĻā§ āĻ
āĻŦāĻļā§āϝāĻ āĻāĻ āĻŦā§āύāĻžāĻŽā§ Apple ID āϏāĻāĻā§āϰāĻžāύā§āϤ āϝā§āĻā§āύ āĻĒā§āϰāϝā§āĻā§āϝ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āύā§āϤāĻŋ āĻŦāĻž Apple āĻĨā§āĻā§ āĻļāϰā§āϤāĻžāĻŦāϞ⧠āĻŽā§āύ⧠āĻāϞāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϰ āϏāĻžāĻĨā§ āϏāϰāĻžāϏāϰāĻŋ āϏāύāĻžāĻā§āϤāĻāĻžāϰ⧠āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āϤāĻĨā§āϝ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻžāϰ āĻāĻā§ āϝā§āĻā§āύ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻĒā§āϰāĻžāĻĒā§āϤ āĻāϰāĻž āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§:
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋ āĻŦāĻž āĻŦāĻŋāĻĒāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϞāĻŋāĻā§āĻ āĻāϰā§āύ.
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻĢā§āύ āύāĻŽā§āĻŦāϰ āϞāĻŋāĻā§āĻ āĻāϰā§āύ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰā§āϤā§
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āϏāĻžāĻŽāĻžāĻāĻŋāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰ (āĻĢā§āϏāĻŦā§āĻ, āĻā§āĻāϞ, āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϤ⧠āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰā§āϤ⧠āϞāĻŋāĻā§āĻ āĻāϰā§āύ⧎
āĻāĻĒāϰā§āϰ āϤāĻžāϞāĻŋāĻāĻžāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāϝāĻŧāĨ¤ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻĒā§āϰāĻŖ āĻāϰāĻā§ āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϏāĻĻāϏā§āϝāĻĒāĻĻ āĻŦāĻŋāĻāĻžāĻā§ āĻ ā§āϝāĻžāĻĒāϞ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻžāĻāϏā§āύā§āϏ āĻā§āĻā§āϤāĻŋ āĻĒāĻĄāĻŧā§āύāĨ¤
firebase::auth::Auth
āĻā§āϞāĻžāϏ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰā§āύ
Auth
āĻā§āϞāĻžāϏ āĻšāϞ āϏāĻŽāϏā§āϤ API āĻāϞā§āϰ āĻā§āĻāĻāϝāĻŧā§āĨ¤- Auth āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĒ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞ āϝā§āĻ āĻāϰā§āύ:
#include "firebase/app.h" #include "firebase/auth.h"
- āĻāĻĒāύāĻžāϰ āĻāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāĻāĻā§āĻļāύ āĻā§āĻĄā§, āĻāĻāĻāĻŋ
firebase::App
āĻā§āϞāĻžāϏ āϤā§āϰāĻŋ āĻāϰā§āύāĨ¤#if defined(__ANDROID__) firebase::App* app = firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity); #else firebase::App* app = firebase::App::Create(firebase::AppOptions()); #endif // defined(__ANDROID__)
- āĻāĻĒāύāĻžāϰ
firebase::App
āĻāύā§āϝfirebase::auth::Auth
āĻā§āϞāĻžāϏ āĻ āϰā§āĻāύ āĻāϰā§āύāĨ¤App
āĻāĻŦāĻAuth
āĻŽāϧā§āϝ⧠āĻāϝāĻŧāĻžāύ-āĻā§-āĻāϝāĻŧāĻžāύ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻāĻā§āĨ¤firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Firebase SDK āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ
āĻ ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ-āĻāύ āĻāϰāĻžāϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž Apple āĻāĻŦāĻ Android āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ āĻā§āĻĄāĻŧā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧāĨ¤
āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽā§
āĻāĻĒāύāĻžāϰ C++ āĻā§āĻĄ āĻĨā§āĻā§ āĻāĻŽāύā§āϤā§āϰāĻŋāϤ Apple āϏāĻžāĻāύ āĻāύ āĻ āĻŦāĻā§āĻā§āĻāĻŋāĻ-āϏāĻŋ SDK-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ Firebase-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύāĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻ āύā§āϰā§āϧā§āϰ āĻāύā§āϝ, āĻāĻāĻāĻŋ āĻāϞā§āĻŽā§āϞ⧠āϏā§āĻā§āϰāĻŋāĻ āϤā§āϰāĻŋ āĻāϰā§āύâāĻāĻāĻāĻŋ "āύāύāϏ"âāϝāĻž āĻāĻĒāύāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ āϝ⧠āĻāĻĒāύāĻŋ āϝ⧠āĻāĻāĻĄāĻŋ āĻā§āĻā§āύāĻāĻŋ āĻĒā§āϝāĻŧā§āĻā§āύ āϤāĻž āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻ āύā§āϰā§āϧā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āĻŽāĻā§āĻā§āϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āϰāĻŋāĻĒā§āϞ⧠āĻāĻā§āϰāĻŽāĻŖ āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻ āĻĒāĻĻāĻā§āώā§āĻĒāĻāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤
- (NSString *)randomNonce:(NSInteger)length { NSAssert(length > 0, @"Expected nonce to have positive length"); NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; NSMutableString *result = [NSMutableString string]; NSInteger remainingLength = length; while (remainingLength > 0) { NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; for (NSInteger i = 0; i < 16; i++) { uint8_t random = 0; int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); [randoms addObject:@(random)]; } for (NSNumber *random in randoms) { if (remainingLength == 0) { break; } if (random.unsignedIntValue < characterSet.length) { unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; [result appendFormat:@"%C", character]; remainingLength--; } } } }
āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϏāĻžāĻāύ-āĻāύ āĻ āύā§āϰā§āϧā§āϰ āϏāĻžāĻĨā§ āύāύāϏā§āϰ SHA256 āĻšā§āϝāĻžāĻļ āĻĒāĻžāĻ āĻžāĻŦā§āύ, āϝāĻž Apple āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāϝāĻŧ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻĒāĻžāϏ āĻāϰāĻŦā§āĨ¤ Firebase āĻāϏāϞ āύāύā§āϏ āĻšā§āϝāĻžāĻļ āĻāϰ⧠āĻāĻŦāĻ Apple āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāϏ āĻāϰāĻž āĻŽāĻžāύā§āϰ āϏāĻžāĻĨā§ āϤā§āϞāύāĻž āĻāϰ⧠āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϝāĻžāĻāĻžāĻ āĻāϰā§āĨ¤
Apple-āĻāϰ āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻļā§āϰ⧠āĻāϰā§āύ, āĻāĻĒāύāĻžāϰ āĻ āύā§āϰā§āϧ⧠āύāύāϏā§āϰ SHA256 āĻšā§āϝāĻžāĻļ āĻāĻŦāĻ āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻŦā§ āĻāĻŽāύ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋ āĻā§āϞāĻžāϏ āϏāĻš (āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒāĻāĻŋ āĻĻā§āĻā§āύ):
- (void)startSignInWithAppleFlow { NSString *nonce = [self randomNonce:32]; self.currentNonce = nonce; ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; request.nonce = [self stringBySha256HashingString:nonce]; ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; authorizationController.delegate = self; authorizationController.presentationContextProvider = self; [authorizationController performRequests]; } - (NSString *)stringBySha256HashingString:(NSString *)input { const char *string = [input UTF8String]; unsigned char result[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(string, (CC_LONG)strlen(string), result); NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [hashed appendFormat:@"%02x", result[i]]; } return hashed; }
āĻāĻĒāύāĻžāϰ ASAuthorizationControllerDelegate` āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ⧠āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύāĨ¤ āϏāĻžāĻāύ-āĻāύ āϏāĻĢāϞ āĻšāϞā§, āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖā§āϰ āĻāύā§āϝ āĻāύāĻšā§āϝāĻžāĻļāĻĄ āύāύā§āϏ āϏāĻš āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĨā§āĻā§ āĻāĻāĻĄāĻŋ āĻā§āĻā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) { if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; NSString *rawNonce = self.currentNonce; NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent."); if (appleIDCredential.identityToken == nil) { NSLog(@"Unable to fetch identity token."); return; } NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding]; if (idToken == nil) { NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); } }
āĻāĻāĻāĻŋ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻŦāĻ Firebase-āĻ āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻĢāϞāϏā§āĻŦāϰā§āĻĒ āĻā§āĻā§āύ āϏā§āĻā§āϰāĻŋāĻ āĻāĻŦāĻ āĻāϏāϞ āύāύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
firebase::auth::OAuthProvider::GetCredential( /*provider_id=*/"apple.com", token, nonce, /*access_token=*/nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
āĻāĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ
Reauthenticate
āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ āϞāĻāĻāύ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŽāύ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻ āĻĒāĻžāϰā§āĻļāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āύāϤā§āύ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤firebase::Future<firebase::auth::AuthResult> result = user->Reauthenticate(credential);
āĻ ā§āϝāĻžāĻĒāϞ āϏāĻžāĻāύ āĻāύā§āϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϞāĻŋāĻā§āĻ āĻāϰāϤ⧠āĻāĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϤā§āϰā§āĻāĻŋāϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻāύ āĻāĻāĻāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ Firebase āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻāĻĒāύāĻŋ āϝ⧠Apple āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻā§āύ āϤāĻžāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ā§ˇ āĻāĻāĻŋ āĻāĻāϞ⧠āĻāĻŦāĻŋāώā§āϝā§
kAuthErrorCredentialAlreadyInUse
āĻāϰ āĻāĻāĻāĻŋ āϏā§āĻĨāĻŋāϤāĻŋ āĻĢāĻŋāϰāĻŋāϝāĻŧā§ āĻĻā§āĻŦā§ āĻāĻŦāĻAuthResult
āĻāĻāĻāĻŋ āĻŦā§āϧcredential
āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻāĻŋ āĻ āύā§āϝ āĻ ā§āϝāĻžāĻĒāϞ āϏāĻžāĻāύ āĻāύ āĻā§āĻā§āύ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻžāĻĄāĻŧāĻžāĻSignInAndRetrieveDataWithCredential
āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ-āϏāĻāϝā§āĻā§āϤ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤firebase::Future<firebase::auth::AuthResult> link_result = auth->current_user().LinkWithCredential(credential); // To keep example simple, wait on the current thread until call completes. while (link_result.status() == firebase::kFutureStatusPending) { Wait(100); } // Determine the result of the link attempt if (link_result.error() == firebase::auth::kAuthErrorNone) { // user linked correctly. } else if (link_result.error() == firebase::auth::kAuthErrorCredentialAlreadyInUse && link_result.result() ->additional_user_info.updated_credential.is_valid()) { // Sign In with the new credential firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential( link_result.result()->additional_user_info.updated_credential); } else { // Another link error occurred. }
āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄā§
āĻ ā§āϝāĻžāύā§āĻĄā§āϰāϝāĻŧā§āĻĄā§, āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ āĻāϝāĻŧā§āĻŦ-āĻāĻŋāϤā§āϤāĻŋāĻ āĻā§āύā§āϰāĻŋāĻ OAuth āϞāĻāĻāύāĻā§ āĻāĻā§āĻā§āϤ āĻāϰ⧠Firebase-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻļā§āώ āĻāϰāĻžāϰ āĻāύā§āϝāĨ¤
Firebase SDK-āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤā§, āĻāĻ āϧāĻžāĻĒāĻā§āϞāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ:
Apple-āĻāϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻāĻāĻĄāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž
FederatedOAuthProviderData
āĻāϰ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āϤā§āϰāĻŋ āĻāϰā§āύāĨ¤firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
āĻāĻā§āĻāĻŋāĻ: āĻĄāĻŋāĻĢāϞā§āĻā§āϰ āĻŦāĻžāĻāϰ⧠āĻ āϤāĻŋāϰāĻŋāĻā§āϤ OAuth 2.0 āϏā§āĻā§āĻĒ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰā§āύ āϝāĻž āĻāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āĻ āύā§āϰā§āϧ āĻāϰāϤ⧠āĻāĻžāύāĨ¤
provider_data.scopes.push_back("email"); provider_data.scopes.push_back("name");
āĻāĻā§āĻāĻŋāĻ: āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāϰā§āĻāĻŋ āĻāĻžāĻĄāĻŧāĻž āĻ āύā§āϝ āĻā§āύ⧠āĻāĻžāώāĻžāϝāĻŧ Apple-āĻāϰ āϏāĻžāĻāύ-āĻāύ āϏā§āĻā§āϰā§āύ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞā§
locale
āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āϏā§āĻ āĻāϰā§āύāĨ¤ āϏāĻŽāϰā§āĻĨāĻŋāϤ āϞā§āĻā§āϞā§āϰ āĻāύā§āϝ āĻ ā§āϝāĻžāĻĒāϞ āĻĄāĻā§āϏ āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻĻā§āĻā§āύāĨ¤// Localize to French. provider_data.custom_parameters["language"] = "fr"; ```
āĻāĻāĻŦāĻžāϰ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āĻĄā§āĻāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻšāϝāĻŧā§ āĻā§āϞā§, āĻāĻāĻāĻŋ FederatedOAuthProvider āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);
Auth āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻŦāϏā§āϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύāĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻ āύā§āϝāĻžāύā§āϝ FirebaseAuth āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒāĻā§āϞāĻŋāϰ āĻŦāĻŋāĻĒāϰā§āϤā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāϝāĻŧā§āĻŦ āĻāĻŋāĻ āĻĒāĻĒ āĻāĻĒ āĻāϰ⧠āĻāĻĒāύāĻžāϰ UI āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāĻŦā§ āϝā§āĻāĻžāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϤāĻžāĻĻā§āϰ āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻā§āϞāĻŋ āĻĒā§āϰāĻŦā§āĻļ āĻāϰāϤ⧠āĻĒāĻžāϰā§ā§ˇ
āϏāĻžāĻāύ āĻāύ āĻĢā§āϞ⧠āĻļā§āϰ⧠āĻāϰāϤā§,
signInWithProvider
āĻāϞ āĻāϰā§āύ:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);
āĻāĻĒāύāĻžāϰ āĻāĻŦā§āĻĻāύāĻāĻŋ āϤāĻāύ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻŦāĻž āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻāĻāĻāĻŋ āĻāϞāĻŦā§āϝāĻžāĻ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠⧎
āĻāĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ
ReauthenticateWithProvider
āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ āϞāĻāĻāύ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŽāύ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒā§āϰ āĻāύā§āϝ āύāϤā§āύ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);
āĻāĻĒāύāĻžāϰ āĻāĻŦā§āĻĻāύāĻāĻŋ āϤāĻāύ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻŦāĻž āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻāĻāĻāĻŋ āĻāϞāĻŦā§āϝāĻžāĻ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠⧎
āĻāĻŦāĻ, āĻāĻĒāύāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āĻŦāĻŋāĻāĻŋāύā§āύ āĻĒāϰāĻŋāĻāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻā§ āϞāĻŋāĻā§āĻ āĻāϰāϤā§
LinkWithCredential()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻ ā§āϝāĻžāĻĒāϞ āĻāĻĒāύāĻžāĻā§ āϤāĻžāĻĻā§āϰ āĻ ā§āϝāĻžāĻĒāϞ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋāĻā§ āĻ āύā§āϝ āĻĄā§āĻāĻžāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻžāϰ āĻāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āϏā§āĻĒāώā§āĻ āϏāĻŽā§āĻŽāϤāĻŋ āύāĻŋāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŦāϰā§āϤāĻŽāĻžāύ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ Facebook āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϞāĻŋāĻā§āĻ āĻāϰāϤā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ Facebook-āĻ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āϝ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻĒā§āϝāĻŧā§āĻā§āύ āϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
// Initialize a Facebook credential with a Facebook access token. AuthCredential credential = firebase::auth::FacebookAuthProvider.getCredential(token); // Assuming the current user is an Apple user linking a Facebook provider. firebase::Future<firebase::auth::AuthResult> result = auth.current_user().LinkWithCredential(credential);
Apple Notes āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ
Firebase Auth āĻĻā§āĻŦāĻžāϰāĻž āϏāĻŽāϰā§āĻĨāĻŋāϤ āĻ āύā§āϝāĻžāύā§āϝ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻĻā§āϰ āĻĨā§āĻā§ āĻāĻŋāύā§āύ, Apple āĻāĻāĻāĻŋ āĻĢāĻā§ URL āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āύāĻžāĨ¤
āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϝāĻāύ āĻ
ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻļā§āϝāĻŧāĻžāϰ āύāĻž āĻāϰāĻž āĻŦā§āĻā§ āύā§āϝāĻŧ, āϤāĻāύ āĻ
ā§āϝāĻžāĻĒāϞ āϏā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ
āύāύā§āϝ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻž āĻāϰ⧠(āĻĢāϰā§āĻŽ xyz@privaterelay.appleid.com
), āϝāĻž āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āĻļā§āϝāĻŧāĻžāϰ āĻāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻāĻŽā§āϞ āϰāĻŋāϞ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ, āĻ
ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāϏāϞ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻŦā§āύāĻžāĻŽā§ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāύ⧠āĻāĻŽā§āϞāĻā§āϞāĻŋ āĻĢāϰāĻāϝāĻŧāĻžāϰā§āĻĄ āĻāϰā§āĨ¤
āĻ
ā§āϝāĻžāĻĒāϞ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ āĻļā§āϝāĻŧāĻžāϰ āĻāϰ⧠āϝā§āĻŽāύ āĻĄāĻŋāϏāĻĒā§āϞ⧠āύāĻžāĻŽ āĻ
ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϝāĻāύ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ, Firebase āĻĄāĻŋāϏāĻĒā§āϞ⧠āύāĻžāĻŽ āϏāĻāϰāĻā§āώāĻŖ āĻāϰ⧠āϝāĻāύ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻ
ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāύ āĻāύ āĻāϰā§, āϝāĻž āĻāĻĒāύāĻŋ current_user().display_name()
āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻā§ Firebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰ⧠āĻ
ā§āϝāĻžāĻĒā§ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻāύā§āϝ Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠Apple āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āϰāĻĻāϰā§āĻļāύā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ Firebase āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§ āύāĻžāĨ¤
āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāĻĻāĻā§āώā§āĻĒ
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ āύāϤā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻšāϝāĻŧâāĻ āϰā§āĻĨāĻžā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ, āĻĢā§āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ â āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āĻā§āύāĨ¤ āĻāĻ āύāϤā§āύ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻ āĻāĻļ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ āύāĻž āĻā§āύ, āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ ā§āϝāĻžāĻĒ āĻā§āĻĄāĻŧā§ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻļāύāĻžāĻā§āϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§, āĻāĻĒāύāĻŋ firebase::auth::User
āĻ
āĻŦāĻā§āĻā§āĻ āĻĨā§āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻŽā§āϞāĻŋāĻ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āϤāĻĨā§āϝ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻĻā§āĻā§āύāĨ¤
āĻāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āϰāĻŋāϝāĻŧā§āϞāĻāĻžāĻāĻŽ āĻĄā§āĻāĻžāĻŦā§āϏ āĻāĻŦāĻ āĻā§āϞāĻžāĻāĻĄ āϏā§āĻā§āϰā§āĻ āϏā§āϰāĻā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§, āĻāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻĨā§āĻā§ āϏāĻžāĻāύ-āĻāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ āύāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻāĻĄāĻŋ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āύ āĻĄā§āĻāĻž āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϤāĻž āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāϤ⧠āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤