אם אפליקציית לקוח 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
של המשתמש או המכשיר המתאים.