تحقق من رموز الهوية

إذا كان تطبيق عميل Firebase الخاص بك يتصل بخادم خلفية مخصص ، فقد تحتاج إلى تحديد المستخدم المسجل الدخول حاليًا على هذا الخادم. للقيام بذلك بشكل آمن ، بعد نجاح تسجيل الدخول ، أرسل رمز معرف المستخدم إلى الخادم الخاص بك باستخدام HTTPS. بعد ذلك ، على الخادم ، تحقق من سلامة وصحة رمز المعرف المميز واسترجع uid منه. يمكنك استخدام uid المستخدم الذي تم إرساله بهذه الطريقة للتعرف بأمان على المستخدم المسجل الدخول حاليًا على الخادم الخاص بك.

قبل ان تبدأ

للتحقق من الرموز المميزة للمعرف باستخدام Firebase Admin SDK ، يجب أن يكون لديك حساب خدمة. اتبع إرشادات إعداد Admin SDK للحصول على مزيد من المعلومات حول كيفية تهيئة Admin SDK باستخدام حساب خدمة.

استرداد الرموز المميزة للمعرف على العملاء

عندما يسجّل مستخدم أو جهاز الدخول بنجاح ، يُنشئ Firebase رمزًا مميزًا للمعرف يعرّفهم بشكل فريد ويمنحهم الوصول إلى العديد من الموارد ، مثل Firebase Realtime Database و Cloud Storage. يمكنك إعادة استخدام رمز المعرف هذا للتعرف على المستخدم أو الجهاز على خادم الواجهة الخلفية المخصص. لاسترداد الرمز المميز للمعرف من العميل ، تأكد من تسجيل دخول المستخدم ثم احصل على رمز المعرف المميز من المستخدم الذي قام بتسجيل الدخول:

iOS +

ج موضوعية
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 != nullptr) {
  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 للمستخدم أو الجهاز المقابل.