āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄā§‡ āĻ…ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ

āĻāĻ¨ā§āĻĄ-āϟ⧁-āĻāĻ¨ā§āĻĄ OAuth 2.0 āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻŋ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ Apple ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase-āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰāϤ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇

Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇, āĻĒā§āϰāĻĨāĻŽā§‡ Apple āĻāϰ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āϏāĻžāχāĻŸā§‡ Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ Apple āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎

āĻ…ā§āϝāĻžāĻĒāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āϝ⧋āĻ— āĻĻāĻŋāύ

Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ Apple āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϏāĻĻāĻ¸ā§āϝāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇⧎

āĻ…ā§āϝāĻžāĻĒāϞ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ

āĻ…ā§āϝāĻžāĻĒāϞ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āϏāĻžāχāĻŸā§‡, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋ āĻ•āϰ⧁āύ:

  1. āĻ“āϝāĻŧ⧇āĻŦ⧇āϰ āϜāĻ¨ā§āϝ Apple āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āϏāĻžāχāύ āχāύ⧇āϰ āĻĒā§āϰāĻĨāĻŽ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻŦāĻ°ā§āĻŖāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āφāĻĒāύāĻžāϰ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ⧎ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āĻšāϞ⧇, āĻāĻ•āϟāĻŋ āϰāĻŋāϟāĻžāĻ°ā§āύ āχāωāφāϰāĻāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ URL āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ:

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    āφāĻĒāύāĻŋ Firebase āĻ•āύāϏ⧋āϞ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āφāχāĻĄāĻŋ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

    āφāĻĒāύāĻžāϰ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, āφāĻĒāύāĻžāϰ āύāϤ⧁āύ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāχāĻĄāĻŋ āύ⧋āϟ āĻ•āϰ⧁āύ, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇⧎

  2. āĻ…ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϕ⧀ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āϏāĻžāχāύ āχāύ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĨ¤ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻĒāύāĻžāϰ āύāϤ⧁āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϕ⧀ āĻāĻŦāĻ‚ āϕ⧀ āφāχāĻĄāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇⧎
  3. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ Firebase Authentication āϕ⧋āύ⧋ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āχāĻŽā§‡āϞ āĻĒāĻžāĻ āĻžāϝāĻŧ, āϝāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ• āϏāĻžāχāύ-āχāύ, āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ, āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻšāĻžāϰ, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏāĻš, Apple āĻĒā§āϰāĻžāχāϭ⧇āϟ āχāĻŽā§‡āϞ āϰāĻŋāϞ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (āĻŦāĻž āφāĻĒāύāĻžāϰ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜāĻĄ āχāĻŽā§‡āϞ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻĻā§āĻŦāĻžāϰāĻž āĻ…ā§āϝāĻžāĻĒāϞ āχāĻŽā§‡āϞ Firebase Authentication āĻĒāĻžāĻ āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āχāĻŽā§‡āϞ āϰāĻŋāϞ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ) āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ.

āĻāĻ•āϟāĻŋ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ Apple āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎

  1. āφāĻĒāύāĻžāϰ Android āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ Firebase āϝ⧋āĻ— āĻ•āϰ⧁āύ āĨ¤ Firebase āĻ•āύāϏ⧋āϞ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ SHA-1 āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻžāĨ¤
  2. Firebase āĻ•āύāϏ⧋āϞ⧇ , Auth āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤ āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻĒāύāĻŋ āϝ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāχāĻĄāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇āύ āϤāĻž āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, OAuth āϕ⧋āĻĄ āĻĢā§āϞ⧋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦāĻŋāĻ­āĻžāϗ⧇ , āφāĻĒāύāĻžāϰ Apple āϟāĻŋāĻŽ āφāχāĻĄāĻŋ āĻāĻŦāĻ‚ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻĒāύāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϕ⧀ āĻāĻŦāĻ‚ āϕ⧀ āφāχāĻĄāĻŋ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤

āĻ…ā§āϝāĻžāĻĒāϞ āĻŦ⧇āύāĻžāĻŽā§€ āĻĄā§‡āϟāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻŽā§‡āύ⧇ āϚāϞ⧁āύ

āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϤāĻžāĻĻ⧇āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϏāĻš āϤāĻžāĻĻ⧇āϰ āĻĄā§‡āϟāĻž āĻŦ⧇āύāĻžāĻŽā§€ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĻ⧇āϝāĻŧ⧎ āϝ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻāχ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻŦ⧇āϛ⧇ āύ⧇āύ āϤāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ privaterelay.appleid.com āĻĄā§‹āĻŽā§‡āύ⧇āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϰāϝāĻŧ⧇āϛ⧇⧎ āφāĻĒāύāĻŋ āϝāĻ–āύ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻ–āύ āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻāχ āĻŦ⧇āύāĻžāĻŽā§€ Apple ID āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āϝ⧇āϕ⧋āύ āĻĒā§āϰāϝ⧋āĻœā§āϝ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āύ⧀āϤāĻŋ āĻŦāĻž Apple āĻĨ⧇āϕ⧇ āĻļāĻ°ā§āϤāĻžāĻŦāϞ⧀ āĻŽā§‡āύ⧇ āϚāϞāϤ⧇ āĻšāĻŦ⧇āĨ¤

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāϰāĻžāϏāϰāĻŋ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϤāĻĨā§āϝ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āφāϗ⧇ āϝ⧇āϕ⧋āύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻĒā§āϰāĻžāĻĒā§āϤ āĻ•āϰāĻž āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇:

  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋ āĻŦāĻž āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ.
  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇
  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āϏāĻžāĻŽāĻžāϜāĻŋāĻ• āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ (āĻĢ⧇āϏāĻŦ⧁āĻ•, āϗ⧁āĻ—āϞ, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϤ⧇ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ⧎

āωāĻĒāϰ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻžāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āύāϝāĻŧāĨ¤ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰāϛ⧇ āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āφāĻĒāύāĻžāϰ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻĻāĻ¸ā§āϝāĻĒāĻĻ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻ…ā§āϝāĻžāĻĒāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞāĻžāχāϏ⧇āĻ¨ā§āϏ āϚ⧁āĻ•ā§āϤāĻŋ āĻĒāĻĄāĻŧ⧁āύāĨ¤

Firebase SDK āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

Android-āĻ, āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ Apple āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰāĻžāϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧ āĻšāϞ Firebase Android SDK-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāĨ¤

Firebase Android SDK-āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇, āĻāχ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ:

  1. āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āφāχāĻĄāĻŋ apple.com āϏāĻžāĻĨ⧇ āĻŦāĻŋāĻ˛ā§āĻĄāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ OAuthProvider āĻāϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

    Kotlin

    val provider = OAuthProvider.newBuilder("apple.com")
    

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    
  2. āϐāĻšā§āĻ›āĻŋāĻ•: āĻĄāĻŋāĻĢāĻ˛ā§āĻŸā§‡āϰ āĻŦāĻžāχāϰ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ 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 āĻ…ā§āϝāĻžāĻĒāϞ āĻĨ⧇āϕ⧇ āϕ⧋āύ⧋ āϏ⧁āϝ⧋āϗ⧇āϰ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧇ āύāĻž āϝāĻĻāĻŋ āύāĻž āφāĻĒāύāĻŋ āϏ⧇āϗ⧁āϞāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇āύāĨ¤

  3. āϐāĻšā§āĻ›āĻŋāĻ•: āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āχāĻ‚āϰ⧇āϜāĻŋ āĻ›āĻžāĻĄāĻŧāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āĻ­āĻžāώāĻžāϝāĻŧ 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");
    
  4. 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-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

  1. āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāχāύ-āχāύ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϜāĻ¨ā§āϝ, āĻāĻ•āϟāĻŋ āĻāϞ⧋āĻŽā§‡āϞ⧋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āĻ¨â€”āĻāĻ•āϟāĻŋ "āύāύāϏ"—āϝāĻž āφāĻĒāύāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϝ⧇ āφāĻĒāύāĻŋ āϝ⧇ āφāχāĻĄāĻŋ āĻŸā§‹āϕ⧇āύāϟāĻŋ āĻĒ⧇āϝāĻŧ⧇āϛ⧇āύ āϤāĻž āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦāĻŋāĻļ⧇āώāĻ­āĻžāĻŦ⧇ āĻŽāĻžā§āϜ⧁āϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϰāĻŋāĻĒā§āϞ⧇ āφāĻ•ā§āϰāĻŽāĻŖ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāχ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤

    āφāĻĒāύāĻŋ 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 āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāϏ āĻ•āϰāĻž āĻŽāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰ⧇ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϝāĻžāϚāĻžāχ āĻ•āϰ⧇āĨ¤

  2. āφāĻĒāύāĻžāϰ OAuth āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦāĻž āĻ…āĻ¨ā§āϝ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Apple āĻāϰ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻŦāĻžāĻš āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻšā§āϝāĻžāĻļāĻĄ āύāĻ¨ā§āϏ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻžāĨ¤

  3. āφāĻĒāύāĻŋ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒāĻžāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇, āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĨ⧇āϕ⧇ āφāχāĻĄāĻŋ āĻŸā§‹āϕ⧇āύāϟāĻŋ āĻĒāĻžāύ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ AuthCredential āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āφāύāĻšā§āϝāĻžāĻļāĻĄ āύāĻ¨ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ:

    Kotlin

    val credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build()
    

    Java

    AuthCredential credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build();
    
  4. 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 āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤

āĻāχ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰāϤ⧇, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āĻ•āϰ⧁āύ:

  1. Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ AuthResult āĻĒ⧇āϤ⧇ startActivityForSignInWithProvider() āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

  2. āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŸā§‹āϕ⧇āύ āĻĒāĻžāύāĨ¤

    Kotlin

    val oauthCredential: OAuthCredential =  authResult.credential
    val accessToken = oauthCredential.accessToken
    

    Java

    OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential();
    String accessToken = oauthCredential.getAccessToken();
    
  3. 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 ...
              }
            }
      });
    
  1. āĻ…āĻŦāĻļ⧇āώ⧇, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ (āĻāĻŦāĻ‚ āϏāĻŽāĻ¸ā§āϤ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻĄā§‡āϟāĻž) āĻŽā§āϛ⧁āύ

    āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ

    āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ—āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ, āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ — āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āĻāχ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ āύāĻž āϕ⧇āύ, āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…ā§āϝāĻžāĻĒ āϜ⧁āĻĄāĻŧ⧇ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

    • āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇, āφāĻĒāύāĻŋ FirebaseUser āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĨ⧇āϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻŽā§ŒāϞāĻŋāĻ• āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϤāĻĨā§āϝ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻĻ⧇āϖ⧁āύāĨ¤

    • āφāĻĒāύāĻžāϰ Firebase Realtime Database āĻāĻŦāĻ‚ Cloud Storage āϏ⧁āϰāĻ•ā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§‡ , āφāĻĒāύāĻŋ auth āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĨ⧇āϕ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āύāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāχāĻĄāĻŋ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧋āύ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

    āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

    āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϏāĻžāχāύ āφāωāϟ āĻ•āϰāϤ⧇, signOut āĻ•āϞ āĻ•āϰ⧁āύ:

    Kotlin

    Firebase.auth.signOut()

    Java

    FirebaseAuth.getInstance().signOut();