āĻāύā§āĻĄ-āĻā§-āĻāύā§āĻĄ OAuth 2.0 āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ Apple ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāύ āĻāϰāϤā§, āĻĒā§āϰāĻĨāĻŽā§ Apple āĻāϰ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āϏāĻžāĻāĻā§ Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ Apple āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
āĻ ā§āϝāĻžāĻĒāϞ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āϝā§āĻ āĻĻāĻŋāύ
Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Apple āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻĻāϏā§āϝāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§ā§ˇ
āĻ ā§āϝāĻžāĻĒāϞ āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ
āĻ ā§āϝāĻžāĻĒāϞ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āϏāĻžāĻāĻā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤāĻā§āϞāĻŋ āĻāϰā§āύ:
āĻāϝāĻŧā§āĻŦā§āϰ āĻāύā§āϝ Apple āĻāϰ āϏāĻžāĻĨā§ āĻāύāĻĢāĻŋāĻāĻžāϰ āϏāĻžāĻāύ āĻāύā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻŦāĻŋāĻāĻžāĻā§ āĻŦāϰā§āĻŖāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āĻāĻĒāύāĻžāϰ āĻāϝāĻŧā§āĻŦāϏāĻžāĻāĻ āϝā§āĻā§āϤ āĻāϰā§āύ⧎ āĻ āύā§āϰā§āϧ āĻāϰāĻž āĻšāϞā§, āĻāĻāĻāĻŋ āϰāĻŋāĻāĻžāϰā§āύ āĻāĻāĻāϰāĻāϞ āĻšāĻŋāϏāĻžāĻŦā§ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ URL āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āύ:
https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler
āĻāĻĒāύāĻŋ Firebase āĻāύāϏā§āϞ āϏā§āĻāĻŋāĻāϏ āĻĒā§āώā§āĻ āĻžāϝāĻŧ āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒ āĻāĻāĻĄāĻŋ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻžāϰ āĻšāϝāĻŧā§ āĻā§āϞā§, āĻāĻĒāύāĻžāϰ āύāϤā§āύ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāĻāĻĄāĻŋ āύā§āĻ āĻāϰā§āύ, āϝāĻž āĻāĻĒāύāĻžāĻā§ āĻĒāϰāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ā§ˇ
- āĻ ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻā§ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻŋ āϏāĻžāĻāύ āĻāύ āϤā§āϰāĻŋ āĻāϰā§āύ āĨ¤ āĻĒāϰāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻžāϰ āύāϤā§āύ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻā§ āĻāĻŦāĻ āĻā§ āĻāĻāĻĄāĻŋāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ā§ˇ
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ Firebase Authentication āĻā§āύ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāĻŽā§āϞ āĻĒāĻžāĻ āĻžāϝāĻŧ, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻŽā§āϞ āϞāĻŋāĻā§āĻ āϏāĻžāĻāύ-āĻāύ, āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϝāĻžāĻāĻžāĻāĻāϰāĻŖ, āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ, āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āϏāĻš, Apple āĻĒā§āϰāĻžāĻāĻā§āĻ āĻāĻŽā§āϞ āϰāĻŋāϞ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ āĻāĻŦāĻ
noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com
(āĻŦāĻž āĻāĻĒāύāĻžāϰ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻāĻĄ āĻāĻŽā§āϞ āĻā§āĻŽāĻĒā§āϞā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻ ā§āϝāĻžāĻĒāϞ āĻāĻŽā§āϞ Firebase Authentication āĻĒāĻžāĻ āĻžāύā§āϰ āĻāύā§āϝ āĻ ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻāĻŽā§āϞ āϰāĻŋāϞ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ) āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ.
āĻāĻāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ Apple āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
- āĻāĻĒāύāĻžāϰ Android āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĨ¤ Firebase āĻāύāϏā§āϞ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āϏā§āĻ āĻāĻĒ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ SHA-1 āϏā§āĻŦāĻžāĻā§āώāϰ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻžāĨ¤
- Firebase āĻāύāϏā§āϞ⧠, Auth āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤ āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏāĻā§āώāĻŽ āĻāϰā§āύāĨ¤ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻŋ āϝ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāĻāĻĄāĻŋ āϤā§āϰāĻŋ āĻāϰā§āĻā§āύ āϤāĻž āĻāϞā§āϞā§āĻ āĻāϰā§āύāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, OAuth āĻā§āĻĄ āĻĢā§āϞ⧠āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦāĻŋāĻāĻžāĻā§ , āĻāĻĒāύāĻžāϰ Apple āĻāĻŋāĻŽ āĻāĻāĻĄāĻŋ āĻāĻŦāĻ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻžāϰ āϤā§āϰāĻŋ āĻāϰāĻž āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻā§ āĻāĻŦāĻ āĻā§ āĻāĻāĻĄāĻŋ āĻāϞā§āϞā§āĻ āĻāϰā§āύāĨ¤
āĻ ā§āϝāĻžāĻĒāϞ āĻŦā§āύāĻžāĻŽā§ āĻĄā§āĻāĻž āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻŽā§āύ⧠āĻāϞā§āύ
āĻ
ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϏāĻš āϤāĻžāĻĻā§āϰ āĻĄā§āĻāĻž āĻŦā§āύāĻžāĻŽā§ āĻāϰāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒ āĻĻā§āϝāĻŧ⧎ āϝ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāĻ āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āĻŦā§āĻā§ āύā§āύ āϤāĻžāĻĻā§āϰ āĻāĻžāĻā§ privaterelay.appleid.com
āĻĄā§āĻŽā§āύā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϰāϝāĻŧā§āĻā§ā§ˇ āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§ Apple āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻāύ āĻāĻĒāύāĻžāĻā§ āĻ
āĻŦāĻļā§āϝāĻ āĻāĻ āĻŦā§āύāĻžāĻŽā§ Apple ID āϏāĻāĻā§āϰāĻžāύā§āϤ āϝā§āĻā§āύ āĻĒā§āϰāϝā§āĻā§āϝ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āύā§āϤāĻŋ āĻŦāĻž Apple āĻĨā§āĻā§ āĻļāϰā§āϤāĻžāĻŦāϞ⧠āĻŽā§āύ⧠āĻāϞāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϰ āϏāĻžāĻĨā§ āϏāϰāĻžāϏāϰāĻŋ āϏāύāĻžāĻā§āϤāĻāĻžāϰ⧠āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āϤāĻĨā§āϝ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻžāϰ āĻāĻā§ āϝā§āĻā§āύ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻĒā§āϰāĻžāĻĒā§āϤ āĻāϰāĻž āĻāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϤ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻā§āϰāĻŋāϝāĻŧāĻžāĻā§āϞāĻŋ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§:
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋ āĻŦāĻž āĻŦāĻŋāĻĒāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āϞāĻŋāĻā§āĻ āĻāϰā§āύ.
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻĢā§āύ āύāĻŽā§āĻŦāϰ āϞāĻŋāĻā§āĻ āĻāϰā§āύ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰā§āϤā§
- āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āϏāĻžāĻŽāĻžāĻāĻŋāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰ (āĻĢā§āϏāĻŦā§āĻ, āĻā§āĻāϞ, āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻāĻāĻāĻŋ āĻŦā§āύāĻžāĻŽā§ āĻ ā§āϝāĻžāĻĒāϞ āĻāĻāĻĄāĻŋāϤ⧠āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰā§āϤ⧠āϞāĻŋāĻā§āĻ āĻāϰā§āύ⧎
āĻāĻĒāϰā§āϰ āϤāĻžāϞāĻŋāĻāĻžāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āύāϝāĻŧāĨ¤ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻĒā§āϰāĻŖ āĻāϰāĻā§ āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϏāĻĻāϏā§āϝāĻĒāĻĻ āĻŦāĻŋāĻāĻžāĻā§ āĻ ā§āϝāĻžāĻĒāϞ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻžāĻāϏā§āύā§āϏ āĻā§āĻā§āϤāĻŋ āĻĒāĻĄāĻŧā§āύāĨ¤
Firebase SDK āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ
Android-āĻ, āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ Apple āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāĻžāϰ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ āĻāĻĒāĻžāϝāĻŧ āĻšāϞ Firebase Android SDK-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻžāĨ¤
Firebase Android SDK-āĻāϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤā§, āĻāĻ āĻĒāĻĻāĻā§āώā§āĻĒāĻā§āϞāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ:
āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻāĻāĻĄāĻŋ
apple.com
āϏāĻžāĻĨā§ āĻŦāĻŋāϞā§āĻĄāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋOAuthProvider
āĻāϰ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āϤā§āϰāĻŋ āĻāϰā§āύ:Kotlin
val provider = OAuthProvider.newBuilder("apple.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
āĻāĻā§āĻāĻŋāĻ: āĻĄāĻŋāĻĢāϞā§āĻā§āϰ āĻŦāĻžāĻāϰ⧠āĻ āϤāĻŋāϰāĻŋāĻā§āϤ OAuth 2.0 āϏā§āĻā§āĻĒ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰā§āύ āϝāĻž āĻāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āĻ āύā§āϰā§āϧ āĻāϰāϤ⧠āĻāĻžāύāĨ¤
Kotlin
provider.setScopes(arrayOf("email", "name"))
Java
List<String> scopes = new ArrayList<String>() { { add("email"); add("name"); } }; provider.setScopes(scopes);
āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§, āϝāĻāύ āĻĒā§āϰāϤāĻŋ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϏāĻā§āϰāĻŋāϝāĻŧ āĻĨāĻžāĻā§, āϤāĻāύ Firebase āĻāĻŽā§āϞ āĻāĻŦāĻ āύāĻžāĻŽā§āϰ āϏā§āϝā§āĻā§āϰ āĻ āύā§āϰā§āϧ āĻāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ āϏā§āĻāĻŋāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻāĻāĻžāϧāĻŋāĻ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠Firebase āĻ ā§āϝāĻžāĻĒāϞ āĻĨā§āĻā§ āĻā§āύ⧠āϏā§āϝā§āĻā§āϰ āĻ āύā§āϰā§āϧ āĻāϰ⧠āύāĻž āϝāĻĻāĻŋ āύāĻž āĻāĻĒāύāĻŋ āϏā§āĻā§āϞāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰā§āύāĨ¤
āĻāĻā§āĻāĻŋāĻ: āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāϰā§āĻāĻŋ āĻāĻžāĻĄāĻŧāĻž āĻ āύā§āϝ āĻā§āύ⧠āĻāĻžāώāĻžāϝāĻŧ Apple-āĻāϰ āϏāĻžāĻāύ-āĻāύ āϏā§āĻā§āϰā§āύ āĻĒā§āϰāĻĻāϰā§āĻļāύ āĻāϰāϤ⧠āĻāĻžāύ, āϤāĻžāĻšāϞā§
locale
āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āϏā§āĻ āĻāϰā§āύāĨ¤ āϏāĻŽāϰā§āĻĨāĻŋāϤ āϞā§āĻā§āϞā§āϰ āĻāύā§āϝ āĻ ā§āϝāĻžāĻĒāϞ āĻĄāĻā§āϏ āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻĻā§āĻā§āύāĨ¤Kotlin
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr")
Java
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");
OAuth āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύāĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻ āύā§āϝāĻžāύā§āϝ
FirebaseAuth
āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒāĻā§āϞāĻŋāϰ āĻŦāĻŋāĻĒāϰā§āϤā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻā§āϰā§āĻŽ āĻā§āϝāĻžāĻŦ āĻā§āϞāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻĒāύāĻžāϰ UI āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāĻŦā§ā§ˇ āĻĢāϞāϏā§āĻŦāϰā§āĻĒ,OnSuccessListener
āĻāĻŦāĻOnFailureListener
āĻ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻā§āĻāĻŋāĻāĻŋāĻāĻŋ āĻāϞā§āϞā§āĻ āĻāϰāĻŦā§āύ āύāĻž āϝā§āĻā§āϞāĻŋ āĻāĻĒāύāĻŋ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āĻā§āύ āĻāĻžāϰāĻŖ UI āĻāĻžāϞ⧠āĻšāϞ⧠āϤāĻžāϰāĻž āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§āĨ¤āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒā§āϝāĻŧā§āĻā§āύ āĻāĻŋāύāĻž āϤāĻž āĻāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž āĻāĻāĻŋāϤ. āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āϏāĻžāĻāύ āĻāύ āĻāϰāĻž āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āϝāĻāϞāĻžāĻĒāĻā§ āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ āϰāĻžāĻā§, āϝāĻžāϰ āĻŽāĻžāύ⧠āϏāĻžāĻāύ āĻāύ āĻĢā§āϞ⧠āĻāϞāĻžāĻāĻžāϞā§āύ āϏāĻŋāϏā§āĻā§āĻŽ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāĻā§ āĻĨāĻžāĻā§ āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻāĻŦāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāϤ⧠āĻŦāĻžāϧā§āϝ āĻāϰāĻŦā§āύ āύāĻž āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻĒāϏā§āĻĨāĻŋāϤ āĻāĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻāĻāĻŋ āĻŽā§āϞāϤā§āĻŦāĻŋ āĻĢāϞāĻžāĻĢāϞ āĻāĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤā§,
getPendingAuthResult()
āĻāϞ āĻāϰā§āύ :Kotlin
val pending = auth.pendingAuthResult if (pending != null) { pending.addOnSuccessListener { authResult -> Log.d(TAG, "checkPending:onSuccess:$authResult") // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). }.addOnFailureListener { e -> Log.w(TAG, "checkPending:onFailure", e) } } else { Log.d(TAG, "pending: null") }
Java
mAuth = FirebaseAuth.getInstance(); Task<AuthResult> pending = mAuth.getPendingAuthResult(); if (pending != null) { pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { Log.d(TAG, "checkPending:onSuccess:" + authResult); // Get the user profile with authResult.getUser() and // authResult.getAdditionalUserInfo(), and the ID // token from Apple with authResult.getCredential(). } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "checkPending:onFailure", e); } }); } else { Log.d(TAG, "pending: null"); }
āĻā§āύ⧠āĻŽā§āϞāϤā§āĻŦāĻŋ āĻĢāϞāĻžāĻĢāϞ āύāĻž āĻĨāĻžāĻāϞā§,
startActivityForSignInWithProvider()
āĻāϞ āĻāϰ⧠āϏāĻžāĻāύ āĻāύ āĻĢā§āϞ⧠āĻļā§āϰ⧠āĻāϰā§āύ :Kotlin
auth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener { authResult -> // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}") val user = authResult.user // ... } .addOnFailureListener { e -> Log.w(TAG, "activitySignIn:onFailure", e) }
Java
mAuth.startActivityForSignInWithProvider(this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Sign-in successful! Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser()); FirebaseUser user = authResult.getUser(); // ... } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "activitySignIn:onFailure", e); } });
Firebase Auth āĻĻā§āĻŦāĻžāϰāĻž āϏāĻŽāϰā§āĻĨāĻŋāϤ āĻ āύā§āϝāĻžāύā§āϝ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻĻā§āϰ āĻĨā§āĻā§ āĻāĻŋāύā§āύ, Apple āĻāĻāĻāĻŋ āĻĢāĻā§ URL āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āύāĻžāĨ¤
āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϝāĻāύ āĻ ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻļā§āϝāĻŧāĻžāϰ āύāĻž āĻāϰāĻž āĻŦā§āĻā§ āύā§āϝāĻŧ, āϤāĻāύ āĻ ā§āϝāĻžāĻĒāϞ āϏā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ āύāύā§āϝ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϰ āĻŦā§āϝāĻŦāϏā§āĻĨāĻž āĻāϰ⧠(āĻĢāϰā§āĻŽ
xyz@privaterelay.appleid.com
), āϝāĻž āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āĻļā§āϝāĻŧāĻžāϰ āĻāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ āĻāĻŽā§āϞ āϰāĻŋāϞ⧠āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ, āĻ ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāϏāϞ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻŦā§āύāĻžāĻŽā§ āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāύ⧠āĻāĻŽā§āϞāĻā§āϞāĻŋ āĻĢāϰāĻāϝāĻŧāĻžāϰā§āĻĄ āĻāϰā§āĨ¤āĻ ā§āϝāĻžāĻĒāϞ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ āĻļā§āϝāĻŧāĻžāϰ āĻāϰ⧠āϝā§āĻŽāύ āĻĄāĻŋāϏāĻĒā§āϞ⧠āύāĻžāĻŽ āĻ ā§āϝāĻžāĻĒā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϝāĻāύ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ, Firebase āĻĄāĻŋāϏāĻĒā§āϞ⧠āύāĻžāĻŽ āϏāĻāϰāĻā§āώāĻŖ āĻāϰ⧠āϝāĻāύ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻ ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāύ āĻāύ āĻāϰā§, āϝāĻž āĻāĻĒāύāĻŋ
getCurrentUser().getDisplayName()
āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻā§ Firebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰ⧠āĻ ā§āϝāĻžāĻĒā§ āĻā§āύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻāύā§āϝ Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠Apple āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āϰāĻĻāϰā§āĻļāύā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ Firebase āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§ āύāĻžāĨ¤
āĻĒā§āύāϰāĻžāϝāĻŧ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāĻŦāĻ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϞāĻŋāĻā§āĻāĻŋāĻ
āĻāĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ startActivityForReauthenticateWithProvider()
āĻāϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āĻāĻĒāύāĻŋ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŽāύ āϏāĻāĻŦā§āĻĻāύāĻļā§āϞ āĻ
āĻĒāĻžāϰā§āĻļāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āύāϤā§āύ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
Kotlin
// The user is already signed-in.
val firebaseUser = auth.getCurrentUser()
firebaseUser
.startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener( authResult -> {
// User is re-authenticated with fresh tokens and
// should be able to perform sensitive operations
// like account deletion and email or password
// update.
})
.addOnFailureListener( e -> {
// Handle failure.
})
Java
// The user is already signed-in.
FirebaseUser firebaseUser = mAuth.getCurrentUser();
firebaseUser
.startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener(
new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
// User is re-authenticated with fresh tokens and
// should be able to perform sensitive operations
// like account deletion and email or password
// update.
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle failure.
}
});
āĻāĻŦāĻ, āĻāĻĒāύāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻā§ āĻŦāĻŋāĻāĻŋāύā§āύ āĻĒāϰāĻŋāĻāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻā§ āϞāĻŋāĻā§āĻ āĻāϰāϤ⧠linkWithCredential()
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻ ā§āϝāĻžāĻĒāϞ āĻāĻĒāύāĻžāĻā§ āϤāĻžāĻĻā§āϰ āĻ ā§āϝāĻžāĻĒāϞ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋāĻā§ āĻ āύā§āϝ āĻĄā§āĻāĻžāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻžāϰ āĻāĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāĻžāĻ āĻĨā§āĻā§ āϏā§āĻĒāώā§āĻ āϏāĻŽā§āĻŽāϤāĻŋ āύāĻŋāϤ⧠āĻšāĻŦā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŦāϰā§āϤāĻŽāĻžāύ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ Facebook āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϞāĻŋāĻā§āĻ āĻāϰāϤā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ Facebook-āĻ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āϝ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻĒā§āϝāĻŧā§āĻā§āύ āϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
Kotlin
// Initialize a Facebook credential with a Facebook access token.
val credential = FacebookAuthProvider.getCredential(token.getToken())
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
});
Java
// Initialize a Facebook credential with a Facebook access token.
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Facebook credential is linked to the current Apple user.
// The user can now sign in to the same account
// with either Apple or Facebook.
}
}
});
āĻāύā§āύāϤ: āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻŦāĻžāĻš āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞāĻŋ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰā§āύ
āĻāĻĒāύāĻŋ Apple āϏāĻžāĻāύ-āĻāύ JS SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞāĻŋ OAuth āĻĢā§āϞ⧠āϤā§āϰāĻŋ āĻāϰ⧠āĻŦāĻž AppAuth- āĻāϰ āĻŽāϤ⧠āĻāĻāĻāĻŋ OAuth āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻžāĻāύ-āĻāύ āĻĢā§āϞ⧠āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰ⧠āĻ ā§āϝāĻžāĻĒāϞ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏāĻžāĻāύ-āĻāύ āĻ āύā§āϰā§āϧā§āϰ āĻāύā§āϝ, āĻāĻāĻāĻŋ āĻāϞā§āĻŽā§āϞ⧠āϏā§āĻā§āϰāĻŋāĻ āϤā§āϰāĻŋ āĻāϰā§āύâāĻāĻāĻāĻŋ "āύāύāϏ"âāϝāĻž āĻāĻĒāύāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ āϝ⧠āĻāĻĒāύāĻŋ āϝ⧠āĻāĻāĻĄāĻŋ āĻā§āĻā§āύāĻāĻŋ āĻĒā§āϝāĻŧā§āĻā§āύ āϤāĻž āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻ āύā§āϰā§āϧā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āĻŽāĻā§āĻā§āϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āϰāĻŋāĻĒā§āϞ⧠āĻāĻā§āϰāĻŽāĻŖ āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻ āĻĒāĻĻāĻā§āώā§āĻĒāĻāĻŋ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤
āĻāĻĒāύāĻŋ
SecureRandom
āĻāϰ āϏāĻžāĻĨā§ Android āĻ āĻāĻāĻāĻŋ āĻā§āϰāĻŋāĻĒā§āĻā§āĻā§āϰāĻžāĻĢāĻŋāĻāĻāĻžāĻŦā§ āϏā§āϰāĻā§āώāĻŋāϤ āύāύāϏ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϝā§āĻŽāύāĻāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻĻāĻžāĻšāϰāĻŖā§ āϰāϝāĻŧā§āĻā§:Kotlin
private fun generateNonce(length: Int): String { val generator = SecureRandom() val charsetDecoder = StandardCharsets.US_ASCII.newDecoder() charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE) charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE) val bytes = ByteArray(length) val inBuffer = ByteBuffer.wrap(bytes) val outBuffer = CharBuffer.allocate(length) while (outBuffer.hasRemaining()) { generator.nextBytes(bytes) inBuffer.rewind() charsetDecoder.reset() charsetDecoder.decode(inBuffer, outBuffer, false) } outBuffer.flip() return outBuffer.toString() }
Java
private String generateNonce(int length) { SecureRandom generator = new SecureRandom(); CharsetDecoder charsetDecoder = StandardCharsets.US_ASCII.newDecoder(); charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE); charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE); byte[] bytes = new byte[length]; ByteBuffer inBuffer = ByteBuffer.wrap(bytes); CharBuffer outBuffer = CharBuffer.allocate(length); while (outBuffer.hasRemaining()) { generator.nextBytes(bytes); inBuffer.rewind(); charsetDecoder.reset(); charsetDecoder.decode(inBuffer, outBuffer, false); } outBuffer.flip(); return outBuffer.toString(); }
āϤāĻžāϰāĻĒāϰ, āĻšā§āĻā§āϏ āϏā§āĻā§āϰāĻŋāĻ āĻšāĻŋāϏāĻžāĻŦā§ nonce-āĻāϰ SHA246 āĻšā§āϝāĻžāĻļ āĻĒāĻžāύ:
Kotlin
private fun sha256(s: String): String { val md = MessageDigest.getInstance("SHA-256") val digest = md.digest(s.toByteArray()) val hash = StringBuilder() for (c in digest) { hash.append(String.format("%02x", c)) } return hash.toString() }
Java
private String sha256(String s) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digest = md.digest(s.getBytes()); StringBuilder hash = new StringBuilder(); for (byte c: digest) { hash.append(String.format("%02x", c)); } return hash.toString(); }
āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āϏāĻžāĻāύ-āĻāύ āĻ āύā§āϰā§āϧā§āϰ āϏāĻžāĻĨā§ āύāύāϏā§āϰ SHA256 āĻšā§āϝāĻžāĻļ āĻĒāĻžāĻ āĻžāĻŦā§āύ, āϝāĻž Apple āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāϝāĻŧ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻĒāĻžāϏ āĻāϰāĻŦā§āĨ¤ Firebase āĻāϏāϞ āύāύā§āϏ āĻšā§āϝāĻžāĻļ āĻāϰ⧠āĻāĻŦāĻ Apple āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāϏ āĻāϰāĻž āĻŽāĻžāύā§āϰ āϏāĻžāĻĨā§ āϤā§āϞāύāĻž āĻāϰ⧠āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϝāĻžāĻāĻžāĻ āĻāϰā§āĨ¤
āĻāĻĒāύāĻžāϰ OAuth āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦāĻž āĻ āύā§āϝ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Apple āĻāϰ āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻŦāĻžāĻš āĻļā§āϰ⧠āĻāϰā§āύāĨ¤ āĻāĻĒāύāĻžāϰ āĻ āύā§āϰā§āϧ⧠āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻšāĻŋāϏāĻžāĻŦā§ āĻšā§āϝāĻžāĻļāĻĄ āύāύā§āϏ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻžāĨ¤
āĻāĻĒāύāĻŋ āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĒāĻžāĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻĨā§āĻā§ āĻāĻāĻĄāĻŋ āĻā§āĻā§āύāĻāĻŋ āĻĒāĻžāύ āĻāĻŦāĻ āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻāĻāĻŋ
AuthCredential
āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāύāĻšā§āϝāĻžāĻļāĻĄ āύāύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:Kotlin
val credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build()
Java
AuthCredential credential = OAuthProvider.newCredentialBuilder("apple.com") .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce) .build();
Firebase āĻļāĻāϏāĻžāĻĒāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ:
Kotlin
auth.signInWithCredential(credential) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // User successfully signed in with Apple ID token. // ... } }
Java
mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User successfully signed in with Apple ID token. // ... } } });
signInWithCredential
āĻāϰ āĻāϞ āϏāĻĢāϞ āĻšāϞā§, āĻāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻĄā§āĻāĻž āĻĒā§āϤ⧠getCurrentUser
āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻā§āĻā§āύ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ
āĻ ā§āϝāĻžāĻĒāϞā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āϝ⧠āĻ ā§āϝāĻžāĻĒāĻā§āϞāĻŋ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϤā§āϰāĻŋāĻā§ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āϏā§āĻā§āϞāĻŋāĻā§ āĻ āĻŦāĻļā§āϝāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻ ā§āϝāĻžāĻĒā§āϰ āĻŽāϧā§āϝ⧠āϤāĻžāĻĻā§āϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻļā§āϰ⧠āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻšāĻŦā§, āϝā§āĻŽāύ āĻ ā§āϝāĻžāĻĒ āϏā§āĻā§āϰ āĻĒāϰā§āϝāĻžāϞā§āĻāύāĻž āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāϤ⧠āĻŦāϰā§āĻŖāĻŋāϤ āĻšāϝāĻŧā§āĻā§
āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āϝ⧠āĻ ā§āϝāĻžāĻĒāĻā§āϞāĻŋ āĻ ā§āϝāĻžāĻĒāϞā§āϰ āϏāĻžāĻĨā§ āϏāĻžāĻāύ āĻāύ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āϤāĻžāĻĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻā§āĻā§āύ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāϰāϤ⧠Apple REST API āĻĻāĻŋāϝāĻŧā§ āϏāĻžāĻāύ āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻĒā§āϰāĻŖ āĻāϰāϤā§, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻĒāĻĻāĻā§āώā§āĻĒāĻā§āϞāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰā§āύ:
Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻžāĻāύ-āĻāύ āĻāϰāϤ⧠āĻāĻŦāĻ
AuthResult
āĻĒā§āϤā§startActivityForSignInWithProvider()
āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤āĻ ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻā§āύ āĻĒāĻžāύāĨ¤
Kotlin
val oauthCredential: OAuthCredential = authResult.credential val accessToken = oauthCredential.accessToken
Java
OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential(); String accessToken = oauthCredential.getAccessToken();
revokeAccessToken
API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āĻā§āύ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāϰā§āύāĨ¤Kotlin
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Access token successfully revoked // for the user ... } }
Java
mAuth.revokeAccessToken(accessToken) .addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // Access token successfully revoked // for the user ... } } });
- āĻ
āĻŦāĻļā§āώā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ
ā§āϝāĻžāĻāĻžāĻāύā§āĻ (āĻāĻŦāĻ āϏāĻŽāϏā§āϤ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻĄā§āĻāĻž) āĻŽā§āĻā§āύ
āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāĻĻāĻā§āώā§āĻĒ
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ āύāϤā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻšāϝāĻŧâāĻ āϰā§āĻĨāĻžā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ, āĻĢā§āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ â āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āĻā§āύāĨ¤ āĻāĻ āύāϤā§āύ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻ āĻāĻļ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ āύāĻž āĻā§āύ, āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ ā§āϝāĻžāĻĒ āĻā§āĻĄāĻŧā§ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻļāύāĻžāĻā§āϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§, āĻāĻĒāύāĻŋ
FirebaseUser
āĻ āĻŦāĻā§āĻā§āĻ āĻĨā§āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻŽā§āϞāĻŋāĻ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āϤāĻĨā§āϝ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻĻā§āĻā§āύāĨ¤āĻāĻĒāύāĻžāϰ Firebase Realtime Database āĻāĻŦāĻ Cloud Storage āϏā§āϰāĻā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§ , āĻāĻĒāύāĻŋ
auth
āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻĨā§āĻā§ āϏāĻžāĻāύ-āĻāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ āύāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻāĻĄāĻŋ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āύ āĻĄā§āĻāĻž āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϤāĻž āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāϤ⧠āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āϏāĻžāĻāύ āĻāĻāĻ āĻāϰāϤā§,
signOut
āĻāϞ āĻāϰā§āύ:Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();