إثبات ملكية الرموز المميّزة للهوية

في حال اتصال تطبيق عميل 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
});

بعد الحصول على رمز مميّز للمعرّف، يمكنك إرسال JWT هذا إلى الواجهة الخلفية والتحقّق من صحته. باستخدام SDK لمشرف Firebase أو استخدام JWT تابع لجهة خارجية إذا كان خادمك مكتوبًا بلغة لا يدعمها Firebase على Google Play.

إثبات ملكية الرموز المميّزة للتعريف باستخدام حزمة تطوير البرامج (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
  });

جافا

// 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 باستخدام بيانات اعتماد حساب الخدمة، تستخدم الحزمة الحقل project_id لكائن JSON لحساب الخدمة.
  • في حال ضبط متغيّر البيئة GOOGLE_CLOUD_PROJECT، ستستخدم حزمة تطوير البرامج (SDK) وقيمته كمعرّف المشروع. يتوفر متغير البيئة هذا يتم تشغيل الرمز على بنية Google الأساسية، مثل App Engine Compute Engine

التحقّق من الرموز المميّزة للمعرّفات باستخدام مكتبة JWT تابعة لجهة خارجية

إذا كانت الخلفية بلغة غير متاحة لمشرف Firebase 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 للمستخدم أو الجهاز المقابل.