إذا كان تطبيق عميل 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 باستخدام حساب الخدمة. بعد ذلك، استخدِم طريقة 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']
متابعة
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 تابعة لجهة خارجية
إذا كانت الخلفية بلغة لا يتيحها مدير SDK في Firebase، سيظل بإمكانك التحقّق من رموز التعريف المميّزة. أولاً، ابحث عن مكتبة JWT تابعة لجهة خارجية للغتك. بعد ذلك، تحقَّق من العنوان والحمولة والتوقيع لرمز التعريف المميّز.
تأكَّد من أنّ عنوان رمز التعريف المميّز يتوافق مع القيود التالية:
| مطالبات عنوان الرمز المميّز للتعريف | ||
|---|---|---|
alg |
خوارزمية | "RS256" |
kid |
معرّف المفتاح |
يجب أن يتطابق مع أحد المفاتيح العامة المدرَجة في
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
تأكَّد من أنّ حمولة الرمز المميّز للرقم التعريفي تتوافق مع القيود التالية:
| مطالبات حمولة الرمز المميّز للتعريف | ||
|---|---|---|
exp |
وقت انتهاء الصلاحية | يجب أن يكون في المستقبل. يتم قياس الوقت بالثواني منذ بداية حقبة يونكس. |
iat |
وقت الإصدار | يجب أن يكون التاريخ في الماضي. يتم قياس الوقت بالثواني منذ بداية حقبة يونكس. |
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 للمستخدم أو الجهاز المعنيّ.