אם אפליקציית הלקוח של Firebase מתקשרת עם שרת בק-אנד בהתאמה אישית, יכול להיות שתצטרכו לזהות את המשתמש שמחובר כרגע לשרת הזה. כדי לעשות זאת באופן מאובטח, אחרי כניסה מוצלחת, שולחים את אסימון המזהה של המשתמש לשרת באמצעות HTTPS. לאחר מכן, בשרת, מאמתים את התקינות והאותנטיות של טוקן המזהה ומאחזרים ממנו את uid. אתם יכולים להשתמש ב-uid שמועבר בדרך הזו כדי לזהות באופן מאובטח את המשתמש שמחובר כרגע לשרת שלכם.
לפני שמתחילים
כדי לאמת טוקנים של מזהה באמצעות SDK של Firebase לאדמינים, צריך חשבון שירות. בהוראות להגדרת SDK לאדמינים מוסבר איך להפעיל את 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
// ...
}];
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 לאדמינים באמצעות חשבון שירות. אחר כך משתמשים ב-method 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 אותחל עם אפשרות מפורשת של אפליקציית
projectId, ה-SDK משתמש בערך של האפשרות הזו. - אם ה-SDK אותחל עם פרטי כניסה לחשבון שירות, ה-SDK משתמש בשדה
project_idשל אובייקט ה-JSON של חשבון השירות. - אם משתנה הסביבה
GOOGLE_CLOUD_PROJECTמוגדר, ה-SDK משתמש בערך שלו כמזהה הפרויקט. משתנה הסביבה הזה זמין לקוד שפועל בתשתית של Google, כמו App Engine ו-Compute Engine.
אימות טוקנים של מזהים באמצעות ספריית JWT של צד שלישי
אם ה-backend שלכם כתוב בשפה שלא נתמכת ב-SDK של Firebase לאדמינים, אתם עדיין יכולים לאמת טוקנים של מזהים. קודם כול, מוצאים ספריית JWT של צד שלישי בשפה שלכם. לאחר מכן, מאמתים את הכותרת, המטען הייעודי והחתימה של טוקן המזהה.
מוודאים שהכותרת של טוקן המזהה עומדת במגבלות הבאות:
| הצהרות בכותרת של טוקן המזהה | ||
|---|---|---|
alg |
אלגוריתם | "RS256" |
kid |
מזהה המפתח |
חייב להתאים לאחד מהמפתחות הציבוריים שמופיעים בכתובת
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
מוודאים שהמטען הייעודי (payload) של טוקן המזהה עומד במגבלות הבאות:
| הצהרות מטען ייעודי (payload) של טוקן של מזהה | ||
|---|---|---|
exp |
מועד תפוגה | התאריך חייב להיות בעתיד. הזמן נמדד בשניות מאז ראשית זמן יוניקס (Unix epoch). |
iat |
שעת ההנפקה | התאריך חייב להיות בעבר. הזמן נמדד בשניות מאז ראשית זמן יוניקס (Unix epoch). |
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 של המשתמש או המכשיר המתאימים.