درستی‌سنجی کردن نشان‌های هویت

اگر برنامه مشتری Firebase شما با سرور زیرینه سفارشی ارتباط برقرار می‌کند، ممکن است لازم باشد کاربر واردشده فعلی را در آن سرور شناسایی کنید. برای انجام این کار به‌صورت ایمن، پس‌از ورود به سیستم موفقیت‌آمیز، کد شناسایی کاربر را بااستفاده از HTTPS به سرورتان ارسال کنید. سپس، در سرور، تمامیت و اصالت «شناسه» را درستی‌سنجی کنید و uid را از آن بازیابی کنید. می‌توانید از uid منتقل‌شده به این روش برای شناسایی ایمن کاربر واردشده به سیستم در سرورتان استفاده کنید.

قبل از شروع

برای درستی‌سنجی کردن نشان‌های هویت با «کیت توسعه نرم‌افزار Firebase Admin»، باید حساب خدماتی داشته باشید. برای کسب اطلاعات بیشتر درباره نحوه مقداردهی اولیه «کیت توسعه نرم‌افزار سرپرست» با حساب خدمات، دستورالعمل‌های راه‌اندازی «کیت توسعه نرم‌افزار سرپرست» را دنبال کنید.

بازیابی نشان‌های شناسه در کارخواهان

وقتی کاربر یا دستگاهی با موفقیت وارد سیستم می‌شود، 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) را به زیرینه خود ارسال کنید و آن را بااستفاده از «کیت توسعه نرم‌افزار Firebase Admin» یا بااستفاده از کتابخانه 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 تلاش می‌کند شناسه پروژه را ازطریق یکی از روش‌های زیر دریافت کند:

  • اگر کیت توسعه نرم‌افزار با گزینه برنامه projectId صریح مقداردهی اولیه شده باشد، کیت توسعه نرم‌افزار از مقدار آن گزینه استفاده می‌کند.
  • اگر کیت توسعه نرم‌افزار با اطلاعات اعتباری حساب خدمات مقداردهی اولیه شده باشد، کیت توسعه نرم‌افزار از فیلد project_id شیء JSON حساب خدمات استفاده می‌کند.
  • اگر متغیر محیطی GOOGLE_CLOUD_PROJECT تنظیم شده باشد، «کیت توسعه نرم‌افزار» از مقدار آن به‌عنوان شناسه پروژه استفاده می‌کند. این متغیر محیطی برای کد درحال اجرا در زیرساخت Google مثل App Engine و Compute Engine دردسترس است.

درستی‌سنجی کردن نشان‌های هویت بااستفاده از کتابخانه JWT طرف سوم

اگر زیرینه شما به زبانی است که «کیت توسعه نرم‌افزار Firebase Admin» از آن پشتیبانی نمی‌کند، همچنان می‌توانید نشان‌های شناسایی را درستی‌سنجی کنید. ابتدا، کتابخانه JWT طرف سومی برای زبان خود پیدا کنید. سپس، سرصفحه، بار، و امضای شناسه را درستی‌سنجی کنید.

درستی‌سنجی کنید که سرصفحه کد شناسایی با محدودیت‌های زیر مطابقت داشته باشد:

ادعاهای سرایند داده‌واحد شناسه
alg الگوریتم "RS256"
kid شناسه کلید باید با یکی از کلیدهای عمومی فهرست‌شده در https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com مطابقت داشته باشد

درستی‌سنجی کنید که محتوای رمز هویت با محدودیت‌های زیر مطابقت داشته باشد:

ادعاهای محتوای کد شناسایی
exp زمان انقضا باید در آینده باشد. زمان برحسب ثانیه از تاریخ یونیکس اندازه‌گیری می‌شود.
iat زمان صدور باید در گذشته باشد. زمان برحسب ثانیه از تاریخ یونیکس اندازه‌گیری می‌شود.
aud مخاطبان باید شناسه پروژه Firebase شما باشد، شناسه یکتای پروژه Firebase شما که در نشانی وب کنسول آن پروژه پیدا می‌شود.
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) شناسه ID به‌عنوان uid کاربر یا دستگاه مربوطه استفاده کنید.