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

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

قبل از شروع

برای تأیید کردن توکن‌های شناسه با Firebase Admin 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
});

وقتی کد شناسه را دریافت کردید، می‌توانید آن JSON Web Token (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 تلاش می‌کند ازطریق یکی از روش‌های زیر شناسه پروژه را دریافت کند:

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

درستی‌سنجی کردن کدهای شناسه بااستفاده از کتابخانه JWT شخص ثالث

اگر باطن شما به زبانی است که توسط Firebase Admin SDK پشتیبانی نمی‌شود، همچنان می‌توانید توکن‌های شناسه را تأیید کنید. ابتدا، یک کتابخانه JWT شخص ثالث برای زبان خود پیدا کنید. سپس، سرصفحه، بار داده، و امضای شناسهٔ ID token را درستی‌سنجی کنید.

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

ادعاهای سرصفحه شناسه توکن
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) کد شناسه به‌عنوان uid کاربر یا دستگاه مربوطه استفاده کنید.