אם אפליקציית הלקוח שלכם ב-Firebase מתקשרת עם שרת קצה עורפי בהתאמה אישית, יכול להיות שתצטרכו לזהות את המשתמש שמחובר כרגע בשרת הזה. כדי לעשות זאת בצורה מאובטחת, אחרי כניסה מוצלחת לחשבון, שולחים את אסימון הזהות של המשתמש לשרת באמצעות HTTPS. לאחר מכן, בשרת, מאמתים את השלמות והמקוריות של אסימון המזהה ומאחזרים ממנו את uid
. אפשר להשתמש ב-uid
שמועבר בצורה הזו כדי לזהות בצורה מאובטחת את המשתמש שמחובר כרגע לשרת שלכם.
לפני שמתחילים
כדי לאמת אסימוני מזהה באמצעות Firebase Admin SDK, צריך חשבון שירות. מידע נוסף על הפעלה של Admin SDK באמצעות חשבון שירות זמין בהוראות ההגדרה של Admin 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
});
אחרי שמקבלים אסימון מזהה, אפשר לשלוח את ה-JWT הזה לשרת העורפי ולאמת אותו באמצעות 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();
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 Admin מנסה לקבל מזהה פרויקט באחת מהשיטות הבאות:
- אם ה-SDK אותחל עם אפשרות אפליקציה מפורשת
projectId
, ה-SDK משתמש בערך של האפשרות הזו. - אם ה-SDK אותחל באמצעות פרטי כניסה של חשבון שירות, ה-SDK משתמש בשדה
project_id
של אובייקט ה-JSON של חשבון השירות. - אם משתנה הסביבה
GOOGLE_CLOUD_PROJECT
מוגדר, ה-SDK משתמש בערך שלו כמזהה הפרויקט. משתנה הסביבה הזה זמין לקוד שפועל בתשתית של Google, כמו App Engine ו-Compute Engine.
אימות אסימוני מזהה באמצעות ספריית JWT של צד שלישי
אם ה-Backend שלכם כתוב בשפה שלא נתמכת על ידי Firebase Admin SDK, עדיין תוכלו לאמת את טוקני הזהות. קודם כל, מחפשים ספריית JWT של צד שלישי בשפה שלכם. לאחר מכן, מאמתים את הכותרת, את מטען הייעודי (payload) ואת החתימה של אסימון הזהות.
בודקים שכותרת אסימון המזהה עומדת במגבלות הבאות:
הצהרות בכותרת של אסימון מזהה | ||
---|---|---|
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
של המשתמש או המכשיר המתאימים.