اگر برنامه مشتری Firebase شما با سرور زیرینه سفارشی ارتباط برقرار میکند، ممکن است لازم باشد کاربر واردشده فعلی را در آن سرور شناسایی کنید. برای انجام این کار بهصورت ایمن، پساز ورود به سیستم موفقیتآمیز،
کد شناسایی کاربر را بااستفاده از HTTPS به سرورتان ارسال کنید. سپس، در سرور، تمامیت و اصالت «شناسه» را درستیسنجی کنید و uid را از آن بازیابی کنید. میتوانید از uid منتقلشده به این روش برای شناسایی ایمن کاربر واردشده به سیستم در سرورتان استفاده کنید.
قبل از شروع
برای درستیسنجی کردن نشانهای هویت با «کیت توسعه نرمافزار Firebase Admin»، باید حساب خدماتی داشته باشید. برای کسب اطلاعات بیشتر درباره نحوه مقداردهی اولیه «کیت توسعه نرمافزار سرپرست» با حساب خدمات، دستورالعملهای راهاندازی «کیت توسعه نرمافزار سرپرست» را دنبال کنید.
بازیابی نشانهای شناسه در کارخواهان
وقتی کاربر یا دستگاهی با موفقیت وارد سیستم میشود، 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 (JWT) را به زیرینه خود ارسال کنید و آن را بااستفاده از «کیت توسعه نرمافزار Firebase Admin» یا بااستفاده از کتابخانه 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» از آن پشتیبانی نمیکند، همچنان میتوانید نشانهای شناسایی را درستیسنجی کنید. ابتدا، کتابخانه JWT طرف سومی برای زبان خود پیدا کنید. سپس، سرصفحه، بار، و امضای شناسه را درستیسنجی کنید.
درستیسنجی کنید که سرصفحه کد شناسایی با محدودیتهای زیر مطابقت داشته باشد:
| ادعاهای سرایند دادهواحد شناسه | ||
|---|---|---|
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)
شناسه ID بهعنوان uid کاربر یا دستگاه مربوطه استفاده کنید.