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