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— предоставляет Consumer SDK доступ к информации о поездке, включая местоположение транспортного средства, маршрут и расчетное время прибытия. Токены авторизации для сервиса поездок должны включать утверждениеtripid:TRIP_IDв заголовкеauthorizationтокена, гдеTRIP_ID— это идентификатор поездки по запросу, которой делятся.VehicleService— предоставляет Consumer SDK информацию о приблизительном местоположении автомобиля для отображения слоя плотности автомобилей и расчёта времени прибытия в пункт посадки. Поскольку Consumer SDK использует только приблизительные местоположения, токены авторизации для сервиса автомобиля не требуют утвержденияvehicleid.
Что такое токен?
Fleet Engine требует использования JSON Web Tokens (JWT) для вызовов методов API из сред с низким уровнем доверия : смартфонов и браузеров.
JWT создается на вашем сервере, подписывается, шифруется и передается клиенту для последующих взаимодействий с сервером до тех пор, пока не истечет срок его действия или он не станет недействительным.
Ключевые детали
- Используйте учетные данные приложения по умолчанию для аутентификации и авторизации в Fleet Engine.
- Используйте соответствующую учетную запись службы для подписи JWT. См. роли учетных записей службы Fleet Engine в разделе Основы Fleet Engine .
Дополнительную информацию о JSON Web Tokens см. в разделе JSON Web Tokens в документе Fleet Engine Essentials .
Как клиенты получают токены?
После того как водитель или потребитель войдет в ваше приложение, используя соответствующие учетные данные авторизации, любые обновления, отправляемые с этого устройства, должны использовать соответствующие токены авторизации, которые передают Fleet Engine разрешения для приложения.
Как разработчик, ваша клиентская реализация должна обеспечивать возможность выполнения следующих действий:
- Получите JSON Web Token с вашего сервера.
- Используйте токен повторно до истечения его срока действия, чтобы свести к минимуму необходимость обновления токена.
- Обновите токен по истечении срока его действия.
Класс AuthTokenFactory генерирует токены авторизации при обновлении местоположения. SDK должен упаковать токены вместе с информацией об обновлении для отправки в Fleet Engine. Перед инициализацией SDK убедитесь, что ваша серверная реализация может выдавать токены.
Подробную информацию о токенах, ожидаемых службой Fleet Engine, см. в разделе Выпуск токенов JSON Web для 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
}
}
}