Consumer SDK با استفاده از JSON Web Tokens مجوز ارائه می کند. JSON Web Token (JWT) یک نشانه مجوز است که یک یا چند ادعا را در مورد یک سرویس ارائه می دهد.
Consumer SDK از JSON Web Token ارائه شده توسط برنامه برای ارتباط با Fleet Engine استفاده می کند. برای جزئیات بیشتر توکنهای مورد انتظار توسط سرور Fleet Engine، به JSON Web Tokens و Issue JSON Web Tokens مراجعه کنید.
توکن مجوز دسترسی به خدمات Fleet Engine زیر را فراهم می کند:
TripService
- به کاربر SDK دسترسی به جزئیات سفر، از جمله موقعیت وسیله نقلیه، مسیر، و ETA را می دهد. نشانههای مجوز برای سرویس سفر باید شامل یک ادعایtripid:TRIP_ID
در سرصفحهauthorization
رمز باشند، جایی کهTRIP_ID
شناسه سفر سفر درخواستی است که به اشتراک گذاشته میشود.VehicleService
- اطلاعات SDK مصرف کننده را در مورد مکان تقریبی خودرو برای نمایش لایه تراکم خودرو و تخمین ETAهای نقطه دریافت می دهد. از آنجایی که Consumer SDK فقط از مکانهای تقریبی استفاده میکند، نشانههای مجوز برای سرویس خودرو نیازی به ادعایvehicleid
ندارند.
توکن چیست؟
Fleet Engine به استفاده از JSON Web Tokens (JWT) نیاز دارد که توسط یک حساب سرویس مناسب برای فراخوانیهای روش API از محیطهای کماعتماد امضا شده است. محیط های کم اعتماد شامل گوشی های هوشمند و مرورگرها هستند. یک JWT در سرور شما ایجاد می شود که یک محیط کاملاً قابل اعتماد است. JWT امضا می شود، رمزگذاری می شود و برای تعاملات بعدی سرور به مشتری ارسال می شود تا زمانی که منقضی شود یا دیگر معتبر نباشد.
باطن شما باید با استفاده از مکانیزم های استاندارد Application Default Credentials احراز هویت و مجوز در برابر Fleet Engine را صادر کند. مطمئن شوید که از JWT هایی استفاده می کنید که توسط یک حساب سرویس مناسب امضا شده اند. برای فهرستی از نقشهای حساب سرویس، نقشهای حساب خدمات Fleet Engine را در Fleet Engine Basics ببینید.
برای اطلاعات بیشتر در مورد JSON Web Tokens، JSON Web Tokens را در Fleet Engine Essentials ببینید.
مشتریان چگونه توکن دریافت می کنند؟
هنگامی که یک راننده یا مصرف کننده با استفاده از اعتبارنامه های مجوز مناسب به برنامه شما وارد می شود، هر به روز رسانی صادر شده از آن دستگاه باید از نشانه های مجوز مناسب استفاده کند که مجوزهای برنامه را به Fleet Engine ارسال می کند.
به عنوان توسعهدهنده، پیادهسازی مشتری شما باید توانایی انجام موارد زیر را ارائه دهد:
- یک نشانه وب JSON از سرور خود دریافت کنید.
- برای به حداقل رساندن بازخوانی توکن، از توکن تا زمان منقضی شدن آن استفاده مجدد کنید.
- زمانی که توکن منقضی شد، آن را رفرش کنید.
کلاس AuthTokenFactory
توکن های مجوز را در زمان به روز رسانی مکان تولید می کند. SDK باید توکن ها را با اطلاعات به روز رسانی بسته بندی کند تا به Fleet Engine ارسال شود. مطمئن شوید که اجرای سمت سرور شما میتواند نشانهها را قبل از شروع اولیه SDK صادر کند.
برای جزئیات بیشتر توکنهای مورد انتظار توسط سرویس Fleet Engine، به شماره JSON Web Tokens for Fleet Engine مراجعه کنید.
نمونه ای از واکشی نشانه مجوز
مثال کد زیر نشان می دهد که چگونه می توان یک پاسخ تماس توکن مجوز را پیاده سازی کرد.
جاوا
class JsonAuthTokenFactory implements AuthTokenFactory {
private static final String TOKEN_URL =
"https://yourauthserver.example/token";
private static class CachedToken {
String tokenValue;
long expiryTimeMs;
String tripId;
}
private CachedToken token;
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
@Override
public String getToken(AuthTokenContext context) {
// If there is no existing token or token has expired, go get a new one.
String tripId = context.getTripId();
if (tripId == null) {
throw new RuntimeException("Trip ID is missing from AuthTokenContext");
}
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
!tripId.equals(token.tripId)) {
token = fetchNewToken(tripId);
}
return token.tokenValue;
}
private static CachedToken fetchNewToken(String tripId) {
String url = TOKEN_URL + "/" + tripId;
CachedToken token = new CachedToken();
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
token.tokenValue = obj.get("ServiceToken").getAsString();
token.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 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000;
} catch (IOException e) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw new RuntimeException("Could not get auth token", e);
}
token.tripId = tripId;
return token;
}
}
کاتلین
class JsonAuthTokenFactory : AuthTokenFactory() {
private var token: CachedToken? = null
/*
* This method is called on a background thread. Blocking is OK. However, be
* aware that no information can be obtained from Fleet Engine until this
* method returns.
*/
override fun getToken(context: AuthTokenContext): String {
// If there is no existing token or token has expired, go get a new one.
val tripId =
context.getTripId() ?:
throw RuntimeException("Trip ID is missing from AuthTokenContext")
if (token == null || System.currentTimeMillis() > token.expiryTimeMs ||
tripId != token.tripId) {
token = fetchNewToken(tripId)
}
return token.tokenValue
}
class CachedToken(
var tokenValue: String? = "",
var expiryTimeMs: Long = 0,
var tripId: String? = "",
)
private companion object {
const val TOKEN_URL = "https://yourauthserver.example/token"
fun fetchNewToken(tripId: String) {
val url = "$TOKEN_URL/$tripId"
val token = CachedToken()
try {
val reader = InputStreamReader(URL(url).openStream())
reader.use {
val obj = com.google.gson.JsonParser.parseReader(r).getAsJsonObject()
token.tokenValue = obj.get("ServiceToken").getAsString()
token.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 5 minutes from that time.
*/
token.expiryTimeMs -= 5 * 60 * 1000
}
} catch (e: IOException) {
/*
* It's OK to throw exceptions here. The error listeners will receive the
* error thrown here.
*/
throw RuntimeException("Could not get auth token", e)
}
token.tripId = tripId
return token
}
}
}