Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

אמת את אסימוני הזהות

אם אפליקציית לקוח Firebase שלך ​​מתקשרת עם שרת backend מותאם אישית, ייתכן שיהיה עליך לזהות את המשתמש המחובר כעת בשרת זה. כדי לעשות זאת בצורה מאובטחת, לאחר כניסה מוצלחת, שלח את אסימון הזיהוי של המשתמש לשרת שלך באמצעות HTTPS. לאחר מכן, בשרת, אמת את תקינותו ואת האותנטיות של אסימון הזיהוי ואחזר ממנו את ה- uid . אתה יכול להשתמש ב- uid המועבר בדרך זו כדי לזהות באופן מאובטח את המשתמש המחובר כעת בשרת שלך.

לפני שאתה מתחיל

כדי לאמת אסימונים מזהים באמצעות Firebase Admin SDK, עליך להיות בעל חשבון שירות. פעל לפי הוראות ההתקנה של מנהל מערכת SDK למידע נוסף על אופן אתחול ה- SDK של מנהל המערכת עם חשבון שירות.

אחזר אסימונים מזהים על לקוחות

כאשר משתמש או מכשיר נכנסים בהצלחה, Firebase יוצר אסימון מזהה תואם המזהה אותם באופן ייחודי ומעניק להם גישה למספר משאבים, כגון Firebase Realtime Database ו- Cloud Storage. אתה יכול להשתמש שוב באסימון המזהה כדי לזהות את המשתמש או המכשיר בשרת backend המותאם אישית שלך. כדי לאחזר את אסימון המזהה מהלקוח, ודא שהמשתמש מחובר ואז קבל את אסימון המזהה מהמשתמש הכניסה:

iOS

מטרה-ג
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
                           completion:^(NSString *_Nullable idToken,
                                        NSError *_Nullable error) {
          if (error) {
            // Handle error
            return;
          }

          // Send token to your backend via HTTPS
          // ...
}];
מָהִיר
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
  if let error = error {
    // Handle error
    return;
  }

  // Send token to your backend via HTTPS
  // ...
}

דְמוּי אָדָם

FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            if (task.isSuccessful()) {
                String idToken = task.getResult().getToken();
                // Send token to your backend via HTTPS
                // ...
            } else {
                // Handle error -> task.getException();
            }
        }
    });

אַחְדוּת

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("TokenAsync was canceled.");
   return;
  }

  if (task.IsFaulted) {
    Debug.LogError("TokenAsync encountered an error: " + task.Exception);
    return;
  }

  string idToken = task.Result;

  // Send token to your backend via HTTPS
  // ...
});

C ++

firebase::auth::User* user = auth->current_user();
if (user != nullptr) {
  firebase::Future<std::string> idToken = user->GetToken(true);

  // Send token to your backend via HTTPS
  // ...
}

אינטרנט

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

ברגע שיש לך אסימון מזהה, אתה יכול לשלוח את ה- JWT לאחור שלך ולאמת אותו באמצעות ה- SDK של מנהל ה Firebase, או באמצעות ספריית JWT של צד שלישי אם השרת שלך כתוב בשפה ש- Firebase אינו תומך בה.

אמת את אסימוני הזיהוי באמצעות ה- SDK של מנהל המערכת של Firebase

ל- SDK של מנהל ה- Firebase יש שיטה מובנית לאימות ופענוח אסימונים מזהים. אם לאסימון הזיהוי המסופק יש את הפורמט הנכון, אינו פג תוקפו, והוא חתום כראוי, השיטה מחזירה את אסימון הזיהוי המפוענח. אתה יכול לתפוס את ה- uid של המשתמש או המכשיר מהאסימון המפוענח.

פעל על פי הוראות ההתקנה של מנהל מערכת SDK כדי לאתחל את מנהל המערכת SDK עם חשבון שירות. לאחר מכן השתמש בשיטת verifyIdToken() כדי לאמת אסימון מזהה:

Node.js

// idToken comes from the client app
admin
  .auth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });

ג'אווה

// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

פִּיתוֹן

# id_token comes from the client app (shown above)

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']

ללכת

client, err := app.Auth(ctx)
if err != nil {
	log.Fatalf("error getting Auth client: %v\n", err)
}

token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
	log.Fatalf("error verifying ID token: %v\n", err)
}

log.Printf("Verified ID token: %v\n", token)

C #

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

אימות אסימון מזהה דורש מזהה פרוייקט. ה- Firebase Admin SDK מנסה להשיג מזהה פרויקט באחת מהשיטות הבאות:

  • אם ה- SDK אותחל עם אפשרות אפליקציה projectId מפורשת, ה- SDK משתמש בערך של אפשרות זו.
  • אם ה- SDK אותחל עם אישורי חשבון שירות, ה- SDK משתמש בשדה project_id של אובייקט JSON של חשבון השירות.
  • אם מוגדר משתנה הסביבה GOOGLE_CLOUD_PROJECT , ה- SDK משתמש בערכו כמזהה הפרויקט. משתנה סביבה זה זמין לקודים הפועלים בתשתית גוגל כגון App Engine ו- Compute Engine.

אמת את אסימוני הזיהוי באמצעות ספריית JWT של צד שלישי

אם ה- backend שלך נמצא בשפה שאינה נתמכת על ידי SDK מנהל המערכת של Firebase, אתה עדיין יכול לאמת אסימונים מזהים. ראשית, מצא ספריית JWT של צד שלישי עבור השפה שלך . לאחר מכן, ודא את הכותרת, המטען והחתימה של אסימון הזיהוי.

ודא שכותרת אסימון המזהה תואמת את האילוצים הבאים:

תביעות כותרת אסימון מזהה
alg אַלגוֹרִיתְם "RS256"
kid מזהה מפתח חייב להתאים לאחד המפתחות הציבוריים המפורטים בכתובת https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

ודא שהמטען של אסימון הזיהוי תואם לאילוצים הבאים:

תביעות מטען של תעודת זהות
exp תאריך תפוגה חייב להיות בעתיד. הזמן נמדד בשניות מאז תקופת UNIX.
iat הונפק בזמן חייב להיות בעבר. הזמן נמדד בשניות מאז תקופת UNIX.
aud קהל חייב להיות מזהה פרויקט Firebase שלך, המזהה הייחודי לפרויקט Firebase שלך, אשר נמצא בכתובת ה- URL של המסוף של אותו פרויקט.
iss מנפיק חייב להיות "https://securetoken.google.com/<projectId>" , כאשר <projectId> הוא אותו מזהה פרויקט ששימש ל- aud לעיל.
sub נושא חייב להיות מחרוזת שאיננו ריקה חייב להיות uid של המשתמש או המכשיר.
auth_time זמן אימות חייב להיות בעבר. הזמן בו המשתמש אימת.

לסיום, וודאו כי אסימון הזהות נחתם על ידי המפתח הפרטי המתאים לתביעת kid של האסימון. תפוס את המפתח הציבורי מ- https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com והשתמש בספריית JWT כדי לאמת את החתימה. השתמש בערך max-age בכותרת Cache-Control של התגובה מאותה נקודת קצה כדי לדעת מתי לרענן את המפתחות הציבוריים.

אם כל האימותים לעיל מוצלחים, אתה יכול להשתמש בנושא ( sub ) של אסימון הזיהוי כ- uid של המשתמש או המכשיר המתאימים.