במסמך הזה מוסבר איך להנפיק טוקנים של JSON Web Token (טוקנים של רשת מבוססת JSON) כחלק מהפעלת הגישה של אפליקציות מבוססות אינטרנט ומובייל לנתוני Fleet Engine. אם עדיין לא עשיתם את זה, כדאי לקרוא את המאמר בנושא אסימוני JWT (JSON Web Tokens) בקטע אבטחה ב-Fleet Engine. בעזרת שירות Fleet Engine, אפשר להנפיק JWT באחת מהדרכים הבאות:
- שימוש בספריית ההרשאות – Google ממליצה להשתמש בגישה הזו אם בסיס הקוד כתוב ב-Java. הספרייה הזו מטפלת בהנפקת אסימוני JWT לכל תרחישי השימוש שנדרשים לכם בשירות, ומפשטת מאוד את ההטמעה.
- יצירת אסימוני JWT משלכם – אם אתם לא יכולים להשתמש בספריית ה-JWT שלנו, תצטרכו ליצור אותם בבסיס הקוד שלכם. בקטע הזה מופיעות דוגמאות שונות ל-JWT לכל תרחיש.
איך פועלים JWT
בסביבות לא מהימנות, כמו טלפונים ניידים ודפדפני אינטרנט, שרת הקצה העורפי שלכם מנפיק JWT שפועלים באופן הבא:
קוד הלקוח שפועל בסביבה עם רמת אמון נמוכה קורא לקוד השרת שפועל בסביבה עם רמת אמון מלאה כדי לבקש את ה-JWT המתאים להעברה ל-Fleet Engine.
אסימוני JWT משויכים לחשבונות שירות, כך שבקשות שנשלחות ל-Fleet Engine משויכות באופן מרומז לחשבון השירות שחתם על ה-JWT.
הצהרות JWT מגבילות עוד יותר את המשאבים שהלקוח יכול להפעיל, כמו כלי רכב, נסיעות או משימות ספציפיים.
שימוש בספריית ההרשאות ל-Java
כדי להשתמש בספריית ההרשאות של Fleet Engine ל-Java, אפשר לעבור אל מאגר GitHub. הספרייה מפשטת את יצירת אסימוני ה-JWT של Fleet Engine וחותמת עליהם בצורה מאובטחת. הוא מספק את האפשרויות הבאות:
- הצהרות על תלות של הפרויקט במשאבים
- רשימה מלאה של כל התפקידים בחשבון השירות לנסיעות לפי דרישה או למשימות מתוזמנות
- מנגנוני חתימה על אסימונים שאינם מבוססים על שימוש בקובצי פרטי כניסה, כמו התחזות לחשבון שירות
- מצרף אסימונים חתומים לבקשות יוצאות שנשלחות מ-stub של gRPC או מספריית לקוח של Google API Codegen (GAPIC)
- הוראות לשילוב החותמים עם ספריות הלקוח של Fleet Engine
אם אתם מנפיקים JWTs מהקוד
אם אין לכם אפשרות להשתמש בספריית ההרשאות ל-Java, אתם צריכים להטמיע אסימוני JWT בבסיס הקוד שלכם. בקטע הזה מפורטות כמה הנחיות ליצירת טוקנים משלכם. בקטע אבטחה ב-Fleet Engine מופיעה רשימה של שדות וטענות JWT. במאמר תפקידים של חשבונות שירות מפורטים התפקידים של חשבונות השירות שמשמשים את Fleet Engine. בקטע הבא מופיעה רשימה של דוגמאות ל-JWT לנסיעות לפי דרישה או למשימות מתוזמנות.
הנחיות כלליות
- שימוש בחשבונות שירות ובתפקידים מתאימים. חשבון השירות והתפקיד המשויך מבטיחים שהמשתמש שמבקש את האסימון מורשה לצפות במידע שהאסימון מאפשר לו לגשת אליו. באופן ספציפי:
- אם חותמים על JWT כדי להעביר אותו למכשיר נייד, משתמשים בחשבון השירות לתפקיד Driver או Consumer SDK. אחרת, יכול להיות שמכשיר נייד ישנה נתונים שהוא לא אמור לגשת אליהם.
- אם חותמים על ה-JWT כדי להשתמש בו לקריאות עם הרשאות, צריך להשתמש בחשבון השירות עם תפקיד האדמין הנכון ב-Fleet Engine כשמשתמשים ב-ADC או ב-JWT. אחרת, הפעולה נכשלת.
- משתפים רק את האסימונים שנוצרו. לעולם אל תשתפו את פרטי הכניסה שבהם השתמשתם כדי ליצור את האסימונים.
- במקרה של קריאות gRPC, המנגנון לצירוף האסימון תלוי בשפה ובמסגרת שבהן נעשה שימוש כדי לבצע את הקריאה. כדי לציין אסימון לקריאת HTTP, צריך לכלול כותרת
Authorization
עם אסימון bearer שהערך שלו הוא האסימון. - החזרת מועד התפוגה. השרת צריך להחזיר את תוקף הטוקן, בדרך כלל בשניות.
- אם אתם צריכים ליצור ולחתום על JSON ישירות כנושא אסימון, במקום להשתמש באסימוני גישה מסוג OAuth 2.0, תוכלו לקרוא את ההוראות בנושא הרשאה של חשבון שירות ללא OAuth במסמכי התיעוד למפתחים בנושא זהויות.
לנסיעות לפי דרישה
- כשיוצרים את מטען ה-JWT, מוסיפים תביעה נוספת בקטע authorization עם המפתח
vehicleid
אוtripid
שמוגדר לערך של מזהה הרכב או מזהה הנסיעה שעבורם מתבצעת הקריאה.
למשימות מתוזמנות
- כששרת קורא לממשקי API אחרים, האסימונים צריכים לכלול גם את הטענה המתאימה. כדי לעשות זאת, אפשר לבצע את הפעולות הבאות:
- מגדירים את הערך של כל מפתח ל-
*
. - נותנים למשתמש גישה לכל
taskids
ולכלdeliveryvehicleids
. כדי לעשות את זה, מוסיפים בקשה נוספת בקטע ההרשאה עם המפתחותtaskid
ו-deliveryvehicleid
. - כשמשתמשים בכוכבית (
*
) בטענתtaskids
, היא צריכה להיות הרכיב היחיד במערך.
- מגדירים את הערך של כל מפתח ל-
דוגמאות ל-JWT לנסיעות על פי דרישה
בקטע הזה מופיעות דוגמאות ל-JWT לתרחישים נפוצים אם אתם משתמשים בנסיעות על פי דרישה.
דוגמה לטוקן של פעולה באפליקציית נהג
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_driver_service_account"
}
.
{
"iss": "driver@yourgcpproject.iam.gserviceaccount.com",
"sub": "driver@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"vehicleid": "driver_12345"
}
}
דוגמה לטוקן של פעולה באפליקציה לצרכן
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_consumer_service_account"
}
.
{
"iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
"sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"tripid": "trip_54321"
}
}
דוגמאות ל-JWT למשימות מתוזמנות
בקטע הזה מופיעה דוגמה ל-JWT לתרחישים אופייניים אם משתמשים במשימות מתוזמנות.
דוגמה לטוקן של אפליקציית נהג
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_driver_service_account"
}
.
{
"iss": "driver@yourgcpproject.iam.gserviceaccount.com",
"sub": "driver@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"deliveryvehicleid": "driver_12345"
}
}
דוגמה לטוקן של אפליקציה לצרכן
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_delivery_consumer_service_account"
}
.
{
"iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
"sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"authorization": {
"trackingid": "shipment_12345"
}
}
דוגמאות ל-JWT לפעולות בצי
בקטע הזה מופיעה דוגמה ל-JWT לתרחיש אופייני בפעולות של צי רכב.
דוגמה לטוקן למעקב אחרי כל המשימות והרכבים בצי
בדוגמה הבאה מוצג אסימון שעוקב אחרי כל המשימות והרכבים בצי מתוך אפליקציה מבוססת-אינטרנט שמשמשת מפעיל. ההרשאות שנדרשות לפעולות האלה גדולות יותר מאלה שנדרשות לאפליקציות לקוח. במאמר הגדרת ספריית JavaScript למעקב אחר צי רכב מוסבר על ההטמעה בצד הלקוח שבה נעשה שימוש באסימון הזה:
חתימה על האסימון באמצעות תפקיד
Fleet Engine Delivery Fleet Reader
Cloud IAM.
{
"alg": "RS256",
"typ": "JWT",
"kid": "private_key_id_of_consumer_service_account"
}
.
{
"iss": "superuser@yourgcpproject.iam.gserviceaccount.com",
"sub": "superuser@yourgcpproject.iam.gserviceaccount.com",
"aud": "https://fleetengine.googleapis.com/",
"iat": 1511900000,
"exp": 1511903600,
"scope": "https://www.googleapis.com/auth/xapi",
"authorization": {
"taskid": "*",
"deliveryvehicleid": "*",
}
}
שיטת אימות חלופית לפעולות בשרת העורפי
Google ממליצה להשתמש ב-ADC כדי לאמת פעולות של שרתים בעורף המערכת. אם אתם לא יכולים להשתמש ב-ADC וצריכים להשתמש ב-JWT, תוכלו להיעזר בדוגמאות האלה.
דוגמה לטוקן לפעולה בשרת קצה עורפי על פי דרישה
{ "alg": "RS256", "typ": "JWT", "kid": "private_key_id_of_provider_service_account" } { "iss": "provider@yourgcpproject.iam.gserviceaccount.com", "sub": "provider@yourgcpproject.iam.gserviceaccount.com", "aud": "https://fleetengine.googleapis.com/", "iat": 1511900000, "exp": 1511903600, "authorization": { "vehicleid": "*", "tripid": "*" } }
דוגמה לטוקן של פעולה מתוזמנת בשרת קצה עורפי
{ "alg": "RS256", "typ": "JWT", "kid": "private_key_id_of_provider_service_account" } . { "iss": "provider@yourgcpproject.iam.gserviceaccount.com", "sub": "provider@yourgcpproject.iam.gserviceaccount.com", "aud": "https://fleetengine.googleapis.com/", "iat": 1511900000, "exp": 1511903600, "authorization": { "taskid": "*" } }
טוקן לדוגמה לפעולת יצירת משימות באצווה בשרת קצה עורפי מתוזמן
{ "alg": "RS256", "typ": "JWT", "kid": "private_key_id_of_provider_service_account" } . { "iss": "provider@yourgcpproject.iam.gserviceaccount.com", "sub": "provider@yourgcpproject.iam.gserviceaccount.com", "aud": "https://fleetengine.googleapis.com/", "iat": 1511900000, "exp": 1511903600, "authorization": { "taskids": ["*"] } }
דוגמה לטוקן לפעולה מתוזמנת של שרת קצה עורפי לכל רכב משלוחים
{ "alg": "RS256", "typ": "JWT", "kid": "private_key_id_of_provider_service_account" } . { "iss": "provider@yourgcpproject.iam.gserviceaccount.com", "sub": "provider@yourgcpproject.iam.gserviceaccount.com", "aud": "https://fleetengine.googleapis.com/", "iat": 1511900000, "exp": 1511903600, "authorization": { "deliveryvehicleid": "*" } }
המאמרים הבאים
- מוודאים שההגדרה בוצעה כראוי כדי ליצור רכב ניסיוני ולוודא שהאסימונים פועלים כמצופה
- למידע על שימוש ב-ADC במקום ב-JWT לפעולות בשרת backend, אפשר לעיין בסקירה הכללית בנושא אבטחה.