כדי לאפשר למשתמשים לבצע אימות ב-Firebase באמצעות חשבונות GitHub שלהם, אפשר לשלב באפליקציה שלכם כניסה גנרית מבוססת-אינטרנט באמצעות OAuth באמצעות Firebase SDK כדי לבצע את תהליך הכניסה מקצה לקצה.
לפני שמתחילים
כדי לאפשר למשתמשים להיכנס באמצעות חשבונות GitHub, קודם צריך להפעיל את GitHub כספק כניסה לפרויקט Firebase:
אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.
- במסוף Firebase, פותחים את הקטע Auth.
- בכרטיסייה Sign in method, מפעילים את הספק GitHub.
- מוסיפים את Client ID ואת Client Secret ממסוף המפתחים של הספק הזה אל
תצורת ספק:
- רושמים את האפליקציה בתור אפליקציית פיתוח ב-GitHub ומקבלים את מזהה הלקוח וסוד הלקוח של האפליקציה ב-OAuth 2.0.
- מוודאים שה-URI להפניה אוטומטית של OAuth ב-Firebase (למשל
my-app-12345.firebaseapp.com/__/auth/handler
) מוגדרת ככתובת URL לקריאה חוזרת (callback) של הרשאה בדף ההגדרות של האפליקציה ההגדרות של אפליקציית GitHub.
- לוחצים על שמירה.
בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל
<project>/<app-module>/build.gradle.kts
או<project>/<app-module>/build.gradle
), מוסיפים את התלות בספרייה Firebase Authentication ל-Android. מומלץ להשתמש Firebase Android BoM כדי לשלוט בניהול גרסאות של ספריות.dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.4.0")) // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth") }
באמצעות Firebase Android BoM, האפליקציה שלכם תשתמש תמיד בגרסאות תואמות של ספריות Android של Firebase.
(חלופה) מוסיפים יחסי תלות של ספריית Firebase בלי להשתמש ב-BoM
אם בוחרים שלא להשתמש במאפיין Firebase BoM, צריך לציין כל גרסה של ספריית Firebase בשורת התלות שלו.
שימו לב: אם אתם משתמשים במספר ספריות של Firebase באפליקציה, מומלץ מאוד להשתמש ב-BoM כדי לנהל את הגרסאות של הספריות, וכך לוודא שכל הגרסאות תואמות.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth:23.0.0") }
אם עדיין לא ציינת את טביעת האצבע של SHA-1 של האפליקציה, צריך לעשות זאת דרך דף ההגדרות במסוף Firebase. פרטים נוספים אימות הלקוח לפרטים על קבלת טביעת האצבע SHA-1 של האפליקציה שלך.
טיפול בתהליך הכניסה באמצעות Firebase SDK
אם מפתחים אפליקציה ל-Android, הדרך הקלה ביותר לאמת את המשתמשים בשילוב עם Firebase באמצעות חשבונות GitHub שלהם, צריך לטפל בכל תהליך הכניסה עם ה-SDK של Firebase ל-Android.
כדי לבצע את תהליך הכניסה באמצעות ה-Android SDK של Firebase, צריך לבצע את השלבים הבאים:
בניית מופע של OAuthProvider באמצעות ה-Builder שלו עם הערך מזהה ספק github.com
Kotlin+KTX
val provider = OAuthProvider.newBuilder("github.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
אופציונלי: מציינים פרמטרים מותאמים אישית נוספים של OAuth שרוצים לשלוח עם בקשת ה-OAuth.
Kotlin+KTX
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com")
Java
// Target specific email with login hint. provider.addCustomParameter("login", "your-email@gmail.com");
הפרמטרים שבהם GitHub תומך מפורטים במסמכי העזרה של GitHub OAuth. שימו לב שאי אפשר להעביר פרמטרים שנדרשים ל-Firebase עם
setCustomParameters()
הפרמטרים האלה הם client_id, response_type, redirect_uri, state, scope וגם response_mode.אופציונלי: מציינים היקפי הרשאות OAuth 2.0 נוספים מעבר לפרופיל הבסיסי שרוצים לבקש מספק האימות. אם הבקשה שלכם דורשת גישה לנתוני משתמשים פרטיים מממשקי API של GitHub, מבקשים הרשאות גישה לממשקי API של GitHub בקטע הרשאות API Developer Console של GitHub. היקפי ההרשאות המבוקשים של OAuth חייבים להיות התאמות מדויקות אל את אלה שהוגדרו מראש בהרשאות ה-API של האפליקציה.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("user:email")
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("user:email"); } }; provider.setScopes(scopes);
מבצעים אימות עם Firebase באמצעות אובייקט של ספק OAuth. חשוב לזכור שבניגוד לפעולות אחרות של FirebaseAuth, הפעולה הזו תשלוט בממשק המשתמש על ידי הצגת כרטיסייה מותאמת אישית ב-Chrome. כתוצאה מכך, אין להתייחס לפעילות שלך ב
OnSuccessListener
ו-OnFailureListener
שתחבר, כי הם יתנתקו מיד הפעולה מפעילה את ממשק המשתמש.כדאי לבדוק קודם אם כבר קיבלת תשובה. כניסה באמצעות השיטה הזו מעבירה את הפעילות שלכם לרקע, כך שהמערכת יכולה לאחזר אותה במהלך תהליך הכניסה. כדי לוודא במקרה כזה, לא תנסו לגרום למשתמש לנסות שוב, עליכם לבדוק אם כבר קיימת.
כדי לבדוק אם יש תוצאה בהמתנה, אפשר להתקשר למספר
getPendingAuthResult
:Kotlin+KTX
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. }
כדי להתחיל את תהליך הכניסה, צריך לבצע קריאה ל-
startActivityForSignInWithProvider
:Kotlin+KTX
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. } });
בסיום התהליך, אסימון הגישה מסוג OAuth שמשויך אל אפשר לאחזר את הספק מהאובייקט
OAuthCredential
שמוחזר.באמצעות אסימון הגישה של OAuth, אפשר לבצע קריאה ל-GitHub API.
לדוגמה, כדי לקבל פרטים בסיסיים של פרופיל, אפשר לבצע קריאה ל-API ל-REST ולהעביר את אסימון הגישה בכותרת
Authorization
:הדוגמאות שלמעלה מתמקדות בתהליכי הכניסה, אבל יש גם יכולת לקשר ספק של GitHub למשתמש קיים באמצעות
startActivityForLinkWithProvider
לדוגמה, אפשר לקשר מספר ספקים לאותו משתמש, כדי לאפשר להם להיכנס עם אחד מהם.Kotlin+KTX
// 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+KTX
// 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. } });
השלבים הבאים
אחרי שמשתמש נכנס בפעם הראשונה, נוצר חשבון משתמש חדש שמקושרות לפרטי הכניסה - כלומר שם המשתמש והסיסמה, מספר הטלפון מספר, או פרטים של ספק אימות – המשתמש נכנס באמצעותו. החדש הזה מאוחסנים כחלק מפרויקט Firebase, וניתן להשתמש בהם כדי לזהות משתמש בכל האפליקציות בפרויקט, בלי קשר לאופן שבו המשתמשים נכנסים לחשבון.
-
באפליקציות שלכם, אתם יכולים לקבל את פרטי הפרופיל הבסיסיים של המשתמש מהאובייקט
FirebaseUser
. ניהול משתמשים בכללי האבטחה של Firebase Realtime Database ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש שנכנס לחשבון מהמשתנה
auth
, ולהשתמש בו כדי לקבוע לאילו נתונים למשתמש תהיה גישה.
כדי לאפשר למשתמשים להיכנס לאפליקציה באמצעות כמה ספקי אימות, אפשר לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים.
כדי להוציא משתמש, קוראים לפונקציה
signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();