אם אפליקציית הלקוח שלכם ב-Firebase מתקשרת עם שרת בק-אנד בהתאמה אישית, יכול להיות שתצטרכו לזהות את המשתמש שמחובר כרגע בשרת הזה. כדי לעשות זאת בצורה מאובטחת, אחרי כניסה מוצלחת, שולחים את אסימון הזהות של המשתמש לשרת באמצעות HTTPS. לאחר מכן, בשרת, מאמתים את השלמות והמקוריות של אסימון המזהה ומאחזרים ממנו את uid. אפשר להשתמש ב-uid שמועבר בדרך הזו כדי לזהות בצורה מאובטחת את המשתמש שמחובר כרגע לשרת שלכם.
לפני שמתחילים
כדי לאמת אסימוני מזהה באמצעות SDK של Firebase לאדמינים, צריך חשבון שירות. בהוראות להגדרת SDK לאדמינים מוסבר איך להפעיל את SDK לאדמינים באמצעות חשבון שירות.
אחזור של אסימוני מזהה בלקוחות
כשמשתמש או מכשיר נכנסים לחשבון, Firebase יוצר אסימון מזהה תואם שמזהה אותם באופן ייחודי ומעניק להם גישה למספר מקורות מידע, כמו Firebase Realtime Database ו-Cloud Storage. אפשר להשתמש מחדש באסימון המזהה הזה כדי לזהות את המשתמש או המכשיר בשרת הקצה העורפי המותאם אישית. כדי לאחזר את טוקן ה-ID מהלקוח, מוודאים שהמשתמש מחובר לחשבון ואז מאחזרים את טוקן ה-ID מהמשתמש המחובר:
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
// ...
}];
Swift
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
// ...
}
Android
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();
}
}
});
Unity
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
});
אחרי שיש לכם אסימון מזהה, אתם יכולים לשלוח את אסימון האינטרנט מסוג JSON (JWT) אל ה-בק-אנד ולאמת אותו באמצעות SDK של Firebase לאדמינים, או באמצעות ספריית JWT של צד שלישי אם השרת שלכם כתוב בשפה ש-Firebase לא תומכת בה באופן מקורי.
אימות של טוקנים של מזהים באמצעות SDK של Firebase לאדמינים
ל-SDK של Firebase לאדמינים יש שיטה מובנית לאימות ולפענוח של טוקנים של מזהים. אם אסימון המזהה שסופק הוא בפורמט הנכון, לא פג תוקפו והוא חתום בצורה תקינה, השיטה מחזירה את אסימון המזהה המפוענח. אפשר לאחזר את uid של המשתמש או המכשיר מהאסימון המפוענח.
פועלים לפי ההוראות להגדרת SDK לאדמינים כדי לאתחל את 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();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
Go
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;
כדי לאמת אסימון מזהה, צריך מזהה פרויקט. ה-SDK של Firebase לאדמינים מנסה לקבל מזהה פרויקט באחת מהשיטות הבאות:
- אם ה-SDK אותחל עם אפשרות
projectIdapp מפורשת, ה-SDK משתמש בערך של האפשרות הזו. - אם ה-SDK אותחל באמצעות פרטי כניסה של חשבון שירות, ה-SDK משתמש בשדה
project_idשל אובייקט ה-JSON של חשבון השירות. - אם משתנה הסביבה
GOOGLE_CLOUD_PROJECTמוגדר, ה-SDK משתמש בערך שלו כמזהה הפרויקט. משתנה הסביבה הזה זמין לקוד שפועל בתשתית של Google, כמו App Engine ו-Compute Engine.
אימות אסימוני מזהה באמצעות ספריית JWT של צד שלישי
אם ה-backend שלכם הוא בשפה שלא נתמכת על ידי Firebase Admin SDK, עדיין תוכלו לאמת את טוקני מזהה. קודם כל, מחפשים ספריית JWT של צד שלישי בשפה שלכם. לאחר מכן, מאמתים את הכותרת, ה-payload והחתימה של טוקן ה-ID.
מוודאים שהכותרת של אסימון המזהה עומדת במגבלות הבאות:
| הצהרות בכותרת של אסימון מזהה | ||
|---|---|---|
alg |
אלגוריתם | "RS256" |
kid |
מזהה המפתח |
חייב להתאים לאחד מהמפתחות הציבוריים שמופיעים בכתובת https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
צריך לוודא שהמטען הייעודי (payload) של טוקן ה-ID עומד במגבלות הבאות:
| הצהרות מטען ייעודי (payload) של אסימון מזהה | ||
|---|---|---|
exp |
מועד תפוגה | התאריך חייב להיות בעתיד. הזמן נמדד בשניות מאז ראשית זמן יוניקס (Unix epoch). |
iat |
השעה שבה הונפק | התאריך צריך להיות בעבר. הזמן נמדד בשניות מאז ראשית זמן יוניקס (Unix epoch). |
aud |
קהל | המזהה הייחודי של פרויקט 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 של המשתמש או המכשיר המתאימים.