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

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

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

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

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

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

iOS+

Objective-C
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.is_valid()) {
  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 הזה ל-backend שלך ולאמת אותו באמצעות Firebase Admin SDK, או באמצעות ספריית JWT של צד שלישי אם השרת שלך כתוב בשפה שבה Firebase לא תומך באופן טבעי.

אמת אסימוני מזהה באמצעות Firebase Admin SDK

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

בצע את הוראות ההגדרה של Admin SDK כדי לאתחל את ה-Admin SDK עם חשבון שירות. לאחר מכן, השתמש בשיטת verifyIdToken() כדי לאמת אסימון מזהה:

Node.js

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

Java

// 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 משתמש בערך שלו כמזהה הפרויקט. משתנה סביבה זה זמין עבור קוד הפועל בתשתית Google כגון App Engine ו-Compute Engine.

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

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