מהו אסימון?
בקריאות לשיטות API מסביבות עם רמת אמון נמוכה, מערכת Fleet Engine דורשת שימוש באסימוני JWT (JSON Web Tokens) בחתימה של חשבון שירות מתאים. סביבות עם רמת אמון נמוכה כוללות סמארטפונים ודפדפנים. ה-JWT מגיע בשרת, שהוא סביבה מהימנה לגמרי. ה-JWT נחתם, מוצפן ועובר ללקוח לאינטראקציה הבאה עם השרת, עד שהתוקף שלו פג או שהוא כבר לא בתוקף.
הקצה העורפי צריך לבצע אימות והרשאה מול Fleet Engine באמצעות מנגנונים רגילים של Application Default Credentials. חשוב להשתמש באסימוני JWT שנחתמו על ידי חשבון שירות מתאים. לרשימת התפקידים של חשבונות השירות, ראו תפקידי חשבון השירות של Fleet Engine בקטע יסודות של Fleet Engine.
לעומת זאת, הקצה העורפי צריך לבצע אימות ואישור מול Fleet Engine באמצעות מנגנונים רגילים של Application Default Credentials.
למידע נוסף על אסימוני JSON Web, ראו JSON Web Tokens בקטע יסודות של Fleet Engine.
איך לקוחות מקבלים אסימונים?
אחרי שהנהג או הצרכן מתחברים לאפליקציה באמצעות פרטי הכניסה המתאימים, כל עדכון שיישלח מהמכשיר הזה חייב להשתמש באסימוני ההרשאה המתאימים, שמעבירים ל-Fleet Engine את ההרשאות לאפליקציה.
כמפתחים, ההטמעה של הלקוח אמורה לספק את היכולת לבצע את הפעולות הבאות:
- אחזור אסימון רשת מבוסס JSON מהשרת.
- כדאי לעשות שימוש חוזר באסימון עד שתוקף התוקף שלו יפוג, כדי לצמצם את מספר הרענונים של האסימון.
- צריך לרענן את האסימון כשהתוקף שלו יפוג.
המחלקה AuthTokenFactory
יוצרת אסימוני הרשאה בזמן עדכון המיקום. ערכת ה-SDK צריכה לארוז את האסימונים עם פרטי העדכון כדי לשלוח אותם ל-Fleet Engine. לפני שמפעילים את ה-SDK, צריך לוודא שההטמעה בצד השרת יכולה להנפיק אסימונים.
פרטים על האסימונים ששירות Fleet Engine מצפה להם מפורטים במאמר הנפקת אסימוני אינטרנט מסוג JSON בנושא Fleet Engine.
דוגמה לאחזור של אסימון הרשאה
זהו הטמעת בסיס של AuthTokenFactory
:
class JsonAuthTokenFactory implements AuthTokenFactory {
private String vehicleServiceToken; // initially null
private long expiryTimeMs = 0;
private String vehicleId;
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
@Override
public String getToken(AuthTokenContext authTokenContext) {
String vehicleId = requireNonNull(context.getVehicleId());
if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
// The token has expired, go get a new one.
fetchNewToken(vehicleId);
}
return vehicleServiceToken;
}
private void fetchNewToken(String vehicleId) {
String url = "https://yourauthserver.example/token/" + vehicleId;
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();
// The expiry time could be an hour from now, but just to try and avoid
// passing expired tokens, we subtract 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000;
this.vehicleId = vehicleId;
} catch (IOException e) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw new RuntimeException("Could not get auth token", e);
}
}
}
ההטמעה הספציפית הזו משתמשת בלקוח ה-HTTP המובנה ב-Java כדי לאחזר אסימון בפורמט JSON משרת ההרשאות. הלקוח שומר את האסימון לשימוש חוזר ומאחזר את האסימון מחדש אם האסימון הישן נמצא בתוך 10 דקות ממועד ההתוקף שלו.
יכול להיות שההטמעה שלכם תתבצע באופן שונה, למשל שימוש בשרשור רקע כדי לרענן אסימונים.
למידע על ספריות הלקוח הזמינות של Fleet Engine, ראו ספריות לקוח לשירותי נסיעות על פי דרישה.