Consumer SDK بااستفاده از «نشانهای وب JSON» مجوز ارائه میدهد. «رمزه وب JSON» (JWT) رمزه مجوزی است که یک یا چند ادعا را در سرویسی ارائه میدهد.
کیت توسعه نرمافزار مصرفکننده از «نشان وب JSON» ارائهشده توسط برنامه برای برقراری ارتباط با Fleet Engine استفاده میکند. برای جزئیات نشانهای موردانتظار سرور Fleet Engine، به نشانهای وب JSON و صدور نشانهای وب JSON مراجعه کنید.
نشانواره مجوز دسترسی به سرویسهای Fleet Engine زیر را فراهم میکند:
TripService- به Consumer SDK اجازه میدهد به جزئیات سفر، ازجمله موقعیت خودرو، مسیر، و زمان تخمینی ورود دسترسی داشته باشد. نشانهای مجوز برای سرویس سفر باید شامل ادعایtripid:TRIP_IDدر سرصفحهauthorizationنشان باشد، که در آنTRIP_IDشناسه سفر درخواستی است که همرسانی میشود.VehicleService- اطلاعاتی درباره مکان تقریبی خودرو به Consumer SDK میدهد تا لایه تراکم خودرو را نمایش دهد و زمان تخمینی رسیدن به نقطه سوار شدن را برآورد کند. چون Consumer SDK فقط از مکانهای تقریبی استفاده میکند، نشانهای مجوز برای سرویس خودرو نیازی به ادعایvehicleidندارند.
توکن چیست؟
Fleet Engine برای فراخوانیهای روش میانای برنامهسازی کاربردی از محیطهای با اعتماد پایین (تلفنهای هوشمند و مرورگرها) به استفاده از JSON Web Tokens (JWT) نیاز دارد.
JWT از سرور شما منشأ میگیرد، امضا و رمزگذاری میشود، و برای تعاملات بعدی سرور به کارخواه منتقل میشود تا زمانی که منقضی شود یا دیگر معتبر نباشد.
جزئیات کلید
- از اعتبارنامههای پیشفرض برنامه برای اصالتسنجی و صدور مجوز در Fleet Engine استفاده کنید.
- از حساب سرویس مناسبی برای امضای JWT استفاده کنید. نقشهای Fleet Engine serviceaccount را در مبانی Fleet Engine ببینید.
برای اطلاعات بیشتر درباره «نشانههای وب JSON»، به نشانههای وب JSON در Fleet Engine Essentials مراجعه کنید.
کلاینتها چگونه توکن دریافت میکنند؟
وقتی راننده یا مصرفکننده بااستفاده از اطلاعات کاربری مناسب وارد سیستم برنامه شما میشود، هر بهروزرسانی صادرشده از آن دستگاه باید از نشانهای مجوز مناسب استفاده کند که اجازههای برنامه را به Fleet Engine منتقل میکند.
بهعنوان توسعهدهنده، پیادهسازی مشتری شما باید توانایی انجام کارهای زیر را داشته باشد:
- یک JSON Web Token از سرور خود واکشی کنید.
- برای بهحداقل رساندن دفعات بازآوری کد، از کد تا زمان انقضای آن مجدداً استفاده کنید.
- وقتی ژتون منقضی شد، آن را بازآوری کنید.
کلاس AuthTokenFactory هنگام بهروزرسانی مکان، کدهای مجوز تولید میکند. کیت توسعه نرمافزار باید توکنها را با اطلاعات بهروزرسانی بستهبندی کند تا به Fleet Engine ارسال شود. مطمئن شوید که پیادهسازی سمت سرور شما میتواند قبلاز مقداردهی اولیه کیت توسعه نرمافزار، توکن صادر کند.
برای جزئیات مربوط به توکنهای موردانتظار سرویس Fleet Engine، به صدور JSON Web Tokens برای 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;
}
}
Kotlin
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
}
}
}