اگر برنامه مشتری Firebase شما با یک سرور باطن سفارشی ارتباط برقرار می کند، ممکن است لازم باشد کاربر وارد شده فعلی را در آن سرور شناسایی کنید. برای انجام این کار ایمن، پس از ورود موفقیت آمیز به سیستم، رمز ID کاربر را با استفاده از HTTPS به سرور خود ارسال کنید. سپس در سرور، یکپارچگی و اصالت توکن ID را بررسی کنید و uid
را از آن بازیابی کنید. می توانید از uid
ارسال شده به این روش برای شناسایی ایمن کاربر وارد شده فعلی در سرور خود استفاده کنید.
قبل از شروع
برای تأیید رمزهای ID با Firebase Admin SDK، باید یک حساب سرویس داشته باشید. دستورالعملهای راهاندازی Admin SDK را برای اطلاعات بیشتر در مورد نحوه مقداردهی اولیه Admin SDK با یک حساب سرویس دنبال کنید.
بازیابی نشانه های ID در مشتریان
هنگامی که کاربر یا دستگاهی با موفقیت وارد سیستم میشود، Firebase یک کد ID مربوطه ایجاد میکند که به طور منحصربهفرد آنها را شناسایی میکند و به آنها اجازه دسترسی به چندین منبع، مانند Firebase Realtime Database و Cloud Storage را میدهد. میتوانید برای شناسایی کاربر یا دستگاه در سرور باطن سفارشی خود، از آن کد 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 از مقدار خود به عنوان شناسه پروژه استفاده می کند. این متغیر محیطی برای کدهای در حال اجرا در زیرساخت Google مانند 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
کاربر یا دستگاه مربوطه استفاده کنید.