شناسه های شناسه را تأیید کنید

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

قبل از اینکه شروع کنی

برای تأیید رمزهای ID با Firebase Admin SDK، باید یک حساب سرویس داشته باشید. دستورالعمل‌های راه‌اندازی Admin SDK را برای اطلاعات بیشتر در مورد نحوه مقداردهی اولیه Admin SDK با یک حساب سرویس دنبال کنید.

بازیابی نشانه های ID در مشتریان

هنگامی که کاربر یا دستگاهی با موفقیت وارد سیستم می‌شود، Firebase یک کد شناسه مربوطه ایجاد می‌کند که به طور منحصربه‌فردی آن‌ها را شناسایی می‌کند و به آن‌ها اجازه دسترسی به چندین منبع، مانند پایگاه داده بیدرنگ Firebase و فضای ذخیره‌سازی ابری را می‌دهد. می‌توانید برای شناسایی کاربر یا دستگاه در سرور باطن سفارشی خود، از آن کد ID دوباره استفاده کنید. برای بازیابی رمز شناسه از مشتری، مطمئن شوید که کاربر وارد سیستم شده است و سپس رمز ID را از کاربر وارد شده دریافت کنید:

iOS+

هدف-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
          // ...
}];
سریع
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
  // ...
});

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 را به باطن خود ارسال کنید و با استفاده از Firebase Admin SDK یا با استفاده از یک کتابخانه JWT شخص ثالث اگر سرور شما به زبانی نوشته شده است که Firebase به طور بومی پشتیبانی نمی کند، آن را تأیید کنید.

با استفاده از Firebase Admin SDK، کدهای ID را تأیید کنید

Firebase Admin SDK دارای یک روش داخلی برای تأیید و رمزگشایی توکن های ID است. اگر کد شناسه ارائه شده فرمت صحیحی داشته باشد، منقضی نشده باشد، و به درستی امضا شده باشد، روش کد شناسه رمزگشایی شده را برمی گرداند. می توانید uid کاربر یا دستگاه را از توکن رمزگشایی شده بگیرید.

دستورالعمل‌های راه‌اندازی Admin SDK را دنبال کنید تا Admin SDK را با یک حساب سرویس راه‌اندازی کنید. سپس، از متد verifyIdToken() برای تأیید یک نشانه ID استفاده کنید:

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 تلاش می کند تا یک ID پروژه را از طریق یکی از روش های زیر بدست آورد:

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

رمزهای ID را با استفاده از کتابخانه JWT شخص ثالث تأیید کنید

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

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

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

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

ادعاهای بارگیری رمز شناسه
exp زمان انقضا باید در آینده باشد. زمان از زمان یونیکس بر حسب ثانیه اندازه گیری می شود.
iat صادر شده در زمان باید در گذشته باشد. زمان از زمان یونیکس بر حسب ثانیه اندازه گیری می شود.
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 کاربر یا دستگاه مربوطه استفاده کنید.