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