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

إذا كان تطبيق عميل 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 للمستخدم أو الجهاز المقابل.