اگر برنامه کلاینت Firebase شما با یک سرور backend سفارشی ارتباط برقرار میکند، ممکن است لازم باشد کاربر فعلی وارد شده در آن سرور را شناسایی کنید. برای انجام این کار به صورت ایمن، پس از ورود موفقیتآمیز، شناسه کاربر (ID Token) را با استفاده از HTTPS به سرور خود ارسال کنید. سپس، در سرور، صحت و اعتبار شناسه کاربر (ID Token) را تأیید کرده و uid را از آن بازیابی کنید. میتوانید از uid ارسال شده به این روش برای شناسایی ایمن کاربر فعلی وارد شده در سرور خود استفاده کنید.
قبل از اینکه شروع کنی
برای تأیید شناسههای توکن با Firebase Admin SDK، باید یک حساب کاربری سرویس داشته باشید. برای اطلاعات بیشتر در مورد نحوه راهاندازی Admin SDK با یک حساب کاربری سرویس، دستورالعملهای راهاندازی Admin SDK را دنبال کنید.
بازیابی توکنهای شناسایی روی کلاینتها
وقتی یک کاربر یا دستگاه با موفقیت وارد سیستم میشود، Firebase یک شناسه توکن مربوطه ایجاد میکند که به طور منحصر به فرد آنها را شناسایی میکند و به آنها امکان دسترسی به منابع مختلفی مانند Firebase Realtime Database و Cloud Storage را میدهد. میتوانید از آن شناسه توکن برای شناسایی کاربر یا دستگاه در سرور backend سفارشی خود دوباره استفاده کنید. برای بازیابی شناسه توکن از کلاینت، مطمئن شوید که کاربر وارد سیستم شده است و سپس شناسه توکن را از کاربر وارد شده دریافت کنید:
آیاواس+
هدف-سی
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
});
زمانی که یک توکن شناسه (ID token) داشته باشید، میتوانید آن توکن وب JSON (JWT) را به backend خود ارسال کنید و آن را با استفاده از Firebase Admin SDK یا اگر سرور شما به زبانی نوشته شده است که Firebase به طور بومی از آن پشتیبانی نمیکند، با استفاده از یک کتابخانه JWT شخص ثالث، اعتبارسنجی کنید.
تأیید توکنهای شناسه با استفاده از Firebase Admin SDK
کیت توسعه نرمافزاری ادمین فایربیس (Firebase Admin SDK) یک روش داخلی برای تأیید و رمزگشایی توکنهای شناسه (ID tokens) دارد. اگر توکن شناسه ارائه شده فرمت صحیحی داشته باشد، منقضی نشده باشد و به درستی امضا شده باشد، این روش توکن شناسه رمزگشایی شده را برمیگرداند. میتوانید شناسه کاربری uid کاربر یا دستگاه را از توکن رمزگشایی شده دریافت کنید.
دستورالعملهای راهاندازی Admin SDK را برای راهاندازی Admin SDK با یک حساب کاربری سرویس دنبال کنید. سپس، از متد verifyIdToken() برای تأیید شناسه توکن استفاده کنید:
نود جی اس
// 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 با یک گزینه صریح
projectIdapp مقداردهی اولیه شده باشد، SDK از مقدار آن گزینه استفاده میکند. - اگر SDK با اعتبارنامههای حساب سرویس مقداردهی اولیه شده باشد، SDK از فیلد
project_idشیء JSON حساب سرویس استفاده میکند. - اگر متغیر محیطی
GOOGLE_CLOUD_PROJECTتنظیم شده باشد، SDK از مقدار آن به عنوان شناسه پروژه استفاده میکند. این متغیر محیطی برای کدی که روی زیرساختهای گوگل مانند App Engine و Compute Engine اجرا میشود، در دسترس است.
تأیید توکنهای شناسه با استفاده از یک کتابخانه JWT شخص ثالث
اگر بکاند شما به زبانی است که توسط Firebase Admin SDK پشتیبانی نمیشود، همچنان میتوانید توکنهای شناسه را تأیید کنید. ابتدا، یک کتابخانه JWT شخص ثالث برای زبان خود پیدا کنید . سپس، هدر، payload و امضای توکن شناسه را تأیید کنید.
تأیید کنید که هدر توکن شناسه با محدودیتهای زیر مطابقت دارد:
| ادعاهای مربوط به سربرگ توکن شناسایی | ||
|---|---|---|
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 کاربر یا دستگاه مربوطه استفاده کنید.