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

אם אפליקציית לקוח 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 משתנה הסביבה מוגדרת, ערכת פיתוח התוכנה משתמשת מערכו כפרויקט המזהה. משתנה סביבה זה זמין לקודים הפועלים בתשתית גוגל כגון 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 של המשתמש או מכשיר מקביל.