หากอัปเกรดเป็น Firebase Authentication with Identity Platform แล้ว คุณจะตรวจสอบสิทธิ์ผู้ใช้ด้วย Firebase ได้โดยใช้ผู้ให้บริการที่สอดคล้องกับ OpenID Connect (OIDC) ที่คุณเลือก ซึ่ง ช่วยให้ใช้ผู้ให้บริการข้อมูลประจำตัวที่ Firebase ไม่รองรับโดยค่าเริ่มต้นได้
ก่อนเริ่มต้น
หากต้องการลงชื่อเข้าใช้ผู้ใช้โดยใช้ผู้ให้บริการ OIDC คุณต้องรวบรวมข้อมูลบางอย่างจากผู้ให้บริการก่อน ดังนี้
รหัสไคลเอ็นต์: สตริงที่ไม่ซ้ำกันของผู้ให้บริการซึ่งระบุแอปของคุณ ผู้ให้บริการอาจกำหนดรหัสไคลเอ็นต์ที่แตกต่างกันสำหรับแต่ละแพลตฟอร์มที่คุณรองรับ นี่คือค่าหนึ่งของ
audการอ้างสิทธิ์ในโทเค็นรหัสที่ออกโดยผู้ให้บริการรหัสลับไคลเอ็นต์: สตริงลับที่ผู้ให้บริการใช้เพื่อยืนยันการเป็นเจ้าของ รหัสไคลเอ็นต์ คุณจะต้องมีรหัสลับไคลเอ็นต์ที่ตรงกันสำหรับรหัสไคลเอ็นต์ทุกรหัส (ค่านี้จำเป็นก็ต่อเมื่อคุณใช้ขั้นตอนการใช้รหัสการให้สิทธิ์ ซึ่งเราขอแนะนำเป็นอย่างยิ่ง)
ผู้ออกใบรับรอง: สตริงที่ระบุผู้ให้บริการ ค่านี้ต้องเป็น URL ซึ่งเมื่อต่อท้ายด้วย
/.well-known/openid-configurationจะเป็นตำแหน่ง ของเอกสารการค้นพบ OIDC ของผู้ให้บริการ เช่น หากผู้ออกคือhttps://auth.example.comเอกสารการค้นหาจะต้องพร้อมใช้งานที่https://auth.example.com/.well-known/openid-configuration
หลังจากมีข้อมูลข้างต้นแล้ว ให้เปิดใช้ OpenID Connect เป็นผู้ให้บริการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase โดยทำดังนี้
หากยังไม่ได้อัปเกรดเป็น Firebase Authentication with Identity Platform ให้อัปเกรด การตรวจสอบสิทธิ์ OpenID Connect จะใช้ได้ในโปรเจ็กต์ที่อัปเกรดแล้วเท่านั้น
ในFirebaseคอนโซล ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
ในแท็บวิธีการลงชื่อเข้าใช้ ให้คลิกเพิ่มผู้ให้บริการใหม่ แล้วคลิก OpenID Connect
เลือกว่าคุณจะใช้ขั้นตอนรหัสการให้สิทธิ์หรือ ขั้นตอนการให้สิทธิ์โดยนัย
คุณควรใช้ขั้นตอนรหัสเสมอหากผู้ให้บริการรองรับ โฟลว์โดยนัยมีความปลอดภัยน้อยกว่าและไม่แนะนำให้ใช้
ตั้งชื่อผู้ให้บริการรายนี้ จดรหัสผู้ให้บริการที่สร้างขึ้น ซึ่งจะมีลักษณะคล้ายกับ
oidc.example-providerคุณจะต้องใช้รหัสนี้เมื่อเพิ่ม โค้ดลงชื่อเข้าใช้ในแอประบุรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์ รวมถึงสตริงผู้ออกของผู้ให้บริการ ค่าเหล่านี้ต้องตรงกับค่าที่ผู้ให้บริการกำหนดให้คุณทุกประการ
บันทึกการเปลี่ยนแปลง
จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK
หากคุณกำลังสร้างแอป Android วิธีที่ง่ายที่สุดในการตรวจสอบสิทธิ์ผู้ใช้ด้วย Firebase โดยใช้ผู้ให้บริการ OIDC คือการจัดการขั้นตอนการลงชื่อเข้าใช้ทั้งหมดด้วย Firebase Android SDK
หากต้องการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase Android SDK ให้ทำตามขั้นตอนต่อไปนี้
สร้างอินสแตนซ์ของ OAuthProvider โดยใช้ Builder ที่มี รหัสของผู้ให้บริการ
Kotlin
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
ไม่บังคับ: ระบุพารามิเตอร์ OAuth ที่กำหนดเองเพิ่มเติมที่ต้องการ ส่งพร้อมกับคำขอ OAuth
Kotlin
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
โปรดตรวจสอบพารามิเตอร์ที่ผู้ให้บริการ OIDC รองรับ โปรดทราบว่าคุณไม่สามารถส่งพารามิเตอร์ที่ Firebase กําหนดด้วย
setCustomParameters()พารามิเตอร์เหล่านี้คือ client_id, response_type, redirect_uri, state, scope และ response_modeไม่บังคับ: ระบุขอบเขต OAuth 2.0 เพิ่มเติมที่นอกเหนือจากโปรไฟล์พื้นฐานซึ่งคุณต้องการขอจากผู้ให้บริการตรวจสอบสิทธิ์
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
โปรดตรวจสอบขอบเขตที่ผู้ให้บริการ OIDC ใช้
ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ออบเจ็กต์ผู้ให้บริการ OAuth โปรดทราบว่าการดำเนินการนี้จะควบคุม UI ของคุณโดยการแสดงแท็บ Chrome ที่กำหนดเอง ซึ่งแตกต่างจากการดำเนินการอื่นๆ ของ FirebaseAuth ดังนั้น โปรดอย่าอ้างอิงกิจกรรมของคุณใน
OnSuccessListenerและOnFailureListenerที่คุณแนบมา เนื่องจากระบบจะยกเลิกการแนบทันทีเมื่อ การดำเนินการเริ่ม UIคุณควรตรวจสอบก่อนว่าได้รับคำตอบแล้วหรือยัง การลงชื่อเข้าใช้ด้วยวิธีนี้จะทำให้กิจกรรมของคุณทำงานในเบื้องหลัง ซึ่งหมายความว่าระบบสามารถเรียกคืนกิจกรรมได้ในระหว่างขั้นตอนการลงชื่อเข้าใช้ คุณควรตรวจสอบว่ามีผลลัพธ์อยู่แล้วหรือไม่ เพื่อให้แน่ใจว่า คุณจะไม่ทำให้ผู้ใช้ต้องลองอีกครั้งหากเกิดกรณีนี้ขึ้น
หากต้องการตรวจสอบว่ามีผลลัพธ์ที่รอดำเนินการหรือไม่ ให้โทรหา
getPendingAuthResultKotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
หากต้องการเริ่มขั้นตอนการลงชื่อเข้าใช้ ให้เรียกใช้
startActivityForSignInWithProviderKotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
แม้ว่าตัวอย่างข้างต้นจะเน้นที่ขั้นตอนการลงชื่อเข้าใช้ แต่คุณก็ยังมีความสามารถในการลิงก์ผู้ให้บริการ OIDC กับผู้ใช้ที่มีอยู่โดยใช้
startActivityForLinkWithProviderเช่น คุณสามารถลิงก์ผู้ให้บริการหลายรายกับผู้ใช้รายเดียวกันเพื่อให้ผู้ใช้ลงชื่อเข้าใช้ด้วยผู้ให้บริการรายใดก็ได้Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
คุณสามารถใช้รูปแบบเดียวกันกับ
startActivityForReauthenticateWithProviderซึ่งใช้เพื่อเรียกข้อมูล ข้อมูลเข้าสู่ระบบล่าสุดสำหรับการดำเนินการที่ละเอียดอ่อนซึ่งต้องมีการเข้าสู่ระบบล่าสุดKotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.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. } });
จัดการโฟลว์การลงชื่อเข้าใช้ด้วยตนเอง
หากได้ติดตั้งใช้งานขั้นตอนการลงชื่อเข้าใช้ OpenID Connect ในแอปแล้ว คุณ สามารถใช้โทเค็นรหัสเพื่อตรวจสอบสิทธิ์กับ Firebase ได้โดยตรง
Kotlin
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และ ลิงก์กับข้อมูลเข้าสู่ระบบที่ผู้ใช้ลงชื่อเข้าใช้ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุตัวตน ผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณจะดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์
FirebaseUserดู จัดการผู้ใช้ ใน Firebase Realtime Database และ Cloud Storage กฎความปลอดภัย คุณสามารถ รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
authและใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายได้โดยลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการให้ผู้ใช้ออกจากระบบ ให้เรียกใช้
signOut
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();