คุณสามารถอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ Apple ID ของตนเองได้โดยใช้ Firebase SDK เพื่อดำเนินการตามขั้นตอนการลงชื่อเข้าใช้ OAuth 2.0 แบบครบวงจร
ก่อนเริ่มต้น
หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้โดยใช้ Apple ให้กำหนดค่า "ลงชื่อเข้าใช้ด้วย Apple" ในเว็บไซต์สำหรับนักพัฒนาแอปของ Apple ก่อน แล้วเปิดใช้ Apple เป็นผู้ให้บริการการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase
เข้าร่วมโปรแกรม Developer Program ของ Apple
สมาชิกโปรแกรมนักพัฒนาแอปของ Apple เท่านั้นที่กำหนดค่า "ลงชื่อเข้าใช้ด้วย Apple" ได้
กำหนดค่า "ลงชื่อเข้าใช้ด้วย Apple"
ในเว็บไซต์สำหรับนักพัฒนาแอปของ Apple ให้ทำดังนี้
-
เชื่อมโยงเว็บไซต์กับแอปตามที่อธิบายไว้ในส่วนแรก ของ หัวข้อกำหนดค่า "ลงชื่อเข้าใช้ด้วย Apple" สำหรับเว็บ เมื่อได้รับข้อความแจ้ง ให้ลงทะเบียน URL ต่อไปนี้เป็น URL เปลี่ยนเส้นทางกลับ
https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler
คุณดูรหัสโปรเจ็กต์ Firebase ได้ใน
การตั้งค่า > ทั่วไป แท็บ ของคอนโซลFirebaseเมื่อเสร็จแล้ว ให้จดรหัสบริการใหม่ ซึ่งคุณจะต้องใช้ใน ส่วนถัดไป
- สร้าง คีย์ส่วนตัวสำหรับ "ลงชื่อเข้าใช้ด้วย Apple" คุณจะต้องใช้คีย์ส่วนตัวใหม่และคีย์ ID ในส่วนถัดไป
เปิดใช้ Apple เป็นผู้ให้บริการการลงชื่อเข้าใช้
- เพิ่ม Firebase ในโปรเจ็กต์ Android
-
ระบุลายนิ้วมือ SHA-1 ของแอปหากยังไม่ได้ระบุ
-
ในคอนโซล Firebase ให้ไปที่
การตั้งค่า > แท็บทั่วไป - เลื่อนลงไปที่การ์ดแอปของคุณ เลือกแอป Android แล้ว เพิ่มลายนิ้วมือ SHA-1 ในช่องลายนิ้วมือใบรับรอง SHA
-
ในคอนโซล Firebase ให้ไปที่
- ในคอนโซล Firebase ให้ไปที่ ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการการลงชื่อเข้าใช้Apple ระบุรหัสบริการที่คุณสร้างไว้ในส่วนก่อนหน้า นอกจากนี้ ใน ส่วนการกำหนดค่าขั้นตอนการให้สิทธิ์ OAuth ให้ระบุรหัสทีม Apple และ คีย์ส่วนตัวและรหัสคีย์ที่คุณสร้างไว้ในส่วนก่อนหน้า
ปฏิบัติตามข้อกำหนดด้านข้อมูลที่ไม่ระบุตัวตนของ Apple
"ลงชื่อเข้าใช้ด้วย Apple" ช่วยให้ผู้ใช้มีตัวเลือกในการไม่ระบุตัวตนของข้อมูล ซึ่งรวมถึงอีเมลเมื่อลงชื่อเข้าใช้ ผู้ใช้ที่เลือกตัวเลือกนี้จะมีอีเมลที่มีโดเมน privaterelay.appleid.com เมื่อใช้ "ลงชื่อเข้าใช้ด้วย Apple" ในแอป คุณต้องปฏิบัติตามนโยบายหรือข้อกำหนดสำหรับนักพัฒนาแอปที่เกี่ยวข้องจาก Apple เกี่ยวกับ Apple ID ที่ไม่ระบุตัวตนเหล่านี้
ซึ่งรวมถึงการขอความยินยอมจากผู้ใช้ที่จำเป็นก่อนที่จะเชื่อมโยงข้อมูลส่วนบุคคลที่ระบุตัวตนได้โดยตรงกับ Apple ID ที่ไม่ระบุตัวตน เมื่อใช้การตรวจสอบสิทธิ์ Firebase การดำเนินการนี้อาจรวมถึงการดำเนินการต่อไปนี้
- ลิงก์ที่อยู่อีเมลกับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
- ลิงก์หมายเลขโทรศัพท์กับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
- ลิงก์ข้อมูลเข้าสู่ระบบโซเชียลที่ไม่ระบุตัวตน (Facebook, Google ฯลฯ) กับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
รายการข้างต้นไม่ครอบคลุมทั้งหมด โปรดดูข้อตกลงการอนุญาตให้ใช้สิทธิโปรแกรมนักพัฒนาแอปของ Apple ในส่วนการเป็นสมาชิกของบัญชีนักพัฒนาแอปเพื่อให้แน่ใจว่าแอปของคุณเป็นไปตามข้อกำหนดของ Apple
จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK
ใน Android วิธีที่ง่ายที่สุดในการตรวจสอบสิทธิ์ผู้ใช้ด้วย Firebase โดยใช้บัญชี Apple คือการจัดการขั้นตอนการลงชื่อเข้าใช้ทั้งหมดด้วย Firebase Android SDK
หากต้องการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase Android SDK ให้ทำตามขั้นตอนต่อไปนี้
สร้างอินสแตนซ์ของ
OAuthProviderโดยใช้ Builder ที่มีรหัสผู้ให้บริการapple.comดังนี้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);โดยค่าเริ่มต้น เมื่อเปิดใช้1 บัญชีต่ออีเมล Firebase จะขอขอบเขตอีเมลและชื่อ หากคุณเปลี่ยนการตั้งค่านี้เป็น หลายบัญชีต่อที่อยู่อีเมล Firebase จะไม่ขอขอบเขตใดๆ จาก Apple เว้นแต่คุณจะระบุ
ไม่บังคับ: หากต้องการแสดงหน้าจอลงชื่อเข้าใช้ของ Apple ในภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ ให้ตั้งค่าพารามิเตอร์
localeดูภาษาที่รองรับได้ในเอกสารประกอบ "ลงชื่อเข้าใช้ด้วย Apple"Kotlin
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr")Java
// Localize the Apple authentication screen in French. provider.addCustomParameter("locale", "fr");ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ออบเจ็กต์ผู้ให้บริการ OAuth โปรดทราบว่าการดำเนินการนี้จะควบคุม UI ของคุณโดยการเปิดแท็บ Chrome ที่กำหนดเอง ซึ่งแตกต่างจากการดำเนินการ
FirebaseAuthอื่นๆ ดังนั้น อย่าอ้างอิงกิจกรรมของคุณใน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); } });Apple ไม่ได้ให้ URL รูปภาพ ซึ่งแตกต่างจากผู้ให้บริการรายอื่นๆ ที่ Firebase Auth รองรับ
นอกจากนี้ เมื่อผู้ใช้เลือกที่จะไม่แชร์อีเมลกับแอป Apple จะจัดเตรียมอีเมลที่ไม่ซ้ำกันสำหรับผู้ใช้รายนั้น (ในรูปแบบ
xyz@privaterelay.appleid.com) ซึ่งจะแชร์กับแอปของคุณ หากคุณกำหนดค่าบริการส่งต่ออีเมลส่วนตัว Apple จะส่งต่ออีเมลที่ส่งไปยังอีเมลที่ไม่ระบุตัวตนไปยังอีเมลจริงของผู้ใช้Apple จะแชร์ข้อมูลผู้ใช้ เช่น ชื่อที่แสดง กับแอปเฉพาะในครั้งแรกที่ผู้ใช้ลงชื่อเข้าใช้ โดยปกติแล้ว Firebase จะจัดเก็บชื่อที่แสดงในครั้งแรกที่ผู้ใช้ลงชื่อเข้าใช้ด้วย Apple ซึ่งคุณสามารถรับได้ด้วย
getCurrentUser().getDisplayName()อย่างไรก็ตาม หากก่อนหน้านี้คุณใช้ Apple เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยไม่ได้ใช้ Firebase, 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() เพื่อลิงก์ผู้ให้บริการข้อมูลประจำตัวต่างๆ กับบัญชีที่มีอยู่ได้ด้วย
โปรดทราบว่า Apple กำหนดให้คุณต้องได้รับความยินยอมอย่างชัดแจ้งจากผู้ใช้ก่อนที่จะลิงก์บัญชี Apple กับข้อมูลอื่นๆ
ตัวอย่างเช่น หากต้องการลิงก์บัญชี Facebook กับบัญชี Firebase ปัจจุบัน ให้ใช้โทเค็นเพื่อการเข้าถึงที่คุณได้รับจากการให้ผู้ใช้ลงชื่อเข้าใช้ 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.
}
}
});
ขั้นสูง: จัดการขั้นตอนการลงชื่อเข้าใช้ด้วยตนเอง
นอกจากนี้ คุณยังตรวจสอบสิทธิ์ด้วย Firebase โดยใช้บัญชี Apple ได้ด้วยการจัดการ ขั้นตอนการลงชื่อเข้าใช้โดยใช้ Apple Sign-In JS SDK, สร้าง ขั้นตอน OAuth ด้วยตนเอง หรือใช้ไลบรารี OAuth เช่น AppAuth
สร้างสตริงแบบสุ่ม ซึ่งก็คือ "Nonce" สำหรับคำขอลงชื่อเข้าใช้ทุกรายการ ซึ่งคุณจะใช้เพื่อให้แน่ใจว่าโทเค็นรหัสที่คุณได้รับนั้นได้รับอนุญาตโดยเฉพาะเพื่อตอบสนองต่อคำขอการตรวจสอบสิทธิ์ของแอป ขั้นตอนนี้มีความสำคัญในการป้องกันการโจมตีแบบ Replay
คุณสามารถสร้าง Nonce ที่ปลอดภัยด้วยการเข้ารหัสลับใน Android ได้ด้วย
SecureRandomดังตัวอย่างต่อไปนี้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(); }จากนั้นรับแฮช SHA256 ของ Nonce เป็นสตริงเลขฐานสิบหก ดังนี้
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 ของ Nonce พร้อมกับคำขอลงชื่อเข้าใช้ ซึ่ง Apple จะส่งต่อโดยไม่มีการเปลี่ยนแปลงในการตอบกลับ Firebase จะตรวจสอบการตอบกลับโดยการแฮช Nonce เดิมและเปรียบเทียบกับค่าที่ Apple ส่งมา
เริ่มขั้นตอนการลงชื่อเข้าใช้ของ Apple โดยใช้ไลบรารี OAuth หรือวิธีอื่นๆ อย่าลืมใส่ Nonce ที่แฮชแล้วเป็นพารามิเตอร์ในคำขอ
หลังจากได้รับคำตอบจาก Apple แล้ว ให้รับโทเค็นรหัสจากการตอบกลับ และใช้โทเค็นรหัสและ Nonce ที่ไม่ได้แฮชเพื่อสร้าง
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 กำหนดให้แอปที่รองรับการสร้างบัญชีต้องอนุญาตให้ผู้ใช้เริ่ม การลบบัญชีของตนเองภายในแอปตามที่อธิบายไว้ใน หลักเกณฑ์การตรวจสอบ App Store
นอกจากนี้ แอปที่รองรับ "ลงชื่อเข้าใช้ด้วย Apple" ควรใช้ "ลงชื่อเข้าใช้ด้วย Apple" REST API เพื่อเพิกถอนโทเค็นของผู้ใช้
หากต้องการเป็นไปตามข้อกำหนดนี้ ให้ทำตามขั้นตอนต่อไปนี้
ใช้วิธี
startActivityForSignInWithProvider()เพื่อลงชื่อเข้าใช้โดยใช้ Apple และรับAuthResultรับโทเค็นเพื่อการเข้าถึงสำหรับผู้ให้บริการ Apple
Kotlin
val oauthCredential: OAuthCredential = authResult.credential val accessToken = oauthCredential.accessTokenJava
OAuthCredential oauthCredential = (OAuthCredential) authResult.getCredential(); String accessToken = oauthCredential.getAccessToken();เพิกถอนโทเค็นโดยใช้
revokeAccessTokenAPIKotlin
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 ... } } });
- สุดท้าย ให้ลบบัญชีผู้ใช้ (และข้อมูลทั้งหมดที่
เชื่อมโยง)
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และลิงก์กับข้อมูลเข้าสู่ระบบ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการการตรวจสอบสิทธิ์ที่ผู้ใช้ใช้ลงชื่อเข้าใช้ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์
FirebaseUserดูหัวข้อ จัดการผู้ใช้ ใน Firebase Realtime Database และ Cloud Storage กฎความปลอดภัย คุณสามารถ รับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้ได้จากตัวแปร
authและใช้รหัสนี้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้ผู้ให้บริการการตรวจสอบสิทธิ์หลายรายได้โดยการลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการออกจากระบบของผู้ใช้ ให้เรียกใช้
signOutดังนี้Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();
-