إذا كان تطبيق عميل Firebase يتصل بخادم خلفي مخصص، فقد تحتاج إلى تحديد المستخدم الذي قام بتسجيل الدخول حاليًا على هذا الخادم. للقيام بذلك بشكل آمن، بعد تسجيل الدخول بنجاح، أرسل رمز معرف المستخدم إلى الخادم الخاص بك باستخدام HTTPS. ثم، على الخادم، تحقق من سلامة وأصالة رمز المعرف واحصل على المعرف uid
منه. يمكنك استخدام المعرف uid
الذي تم إرساله بهذه الطريقة للتعرف بشكل آمن على المستخدم الذي قام بتسجيل الدخول حاليًا على الخادم الخاص بك.
قبل ان تبدأ
للتحقق من رموز المعرف باستخدام Firebase Admin SDK، يجب أن يكون لديك حساب خدمة. اتبع تعليمات إعداد Admin SDK للحصول على مزيد من المعلومات حول كيفية تهيئة Admin SDK باستخدام حساب خدمة.
استرداد رموز الهوية على العملاء
عندما يقوم مستخدم أو جهاز بتسجيل الدخول بنجاح، يقوم Firebase بإنشاء رمز معرف مطابق يحدده بشكل فريد ويمنحه الوصول إلى العديد من الموارد، مثل Firebase Realtime Database وCloud Storage. يمكنك إعادة استخدام رمز المعرف هذا لتحديد المستخدم أو الجهاز على خادم الواجهة الخلفية المخصص لديك. لاسترداد رمز المعرف من العميل، تأكد من تسجيل دخول المستخدم ثم احصل على رمز المعرف من المستخدم الذي سجل الدخول:
دائرة الرقابة الداخلية +
ج موضوعية
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
// ...
});
سي ++
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
});
جافا
// 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)
ج#
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
للمستخدم أو الجهاز المقابل.