Получить токены авторизации

SDK для потребителей обеспечивает авторизацию с использованием JSON Web Tokens. JSON Web Token (JWT) — это токен авторизации, который предоставляет одно или несколько утверждений для сервиса.

SDK для потребителей использует JSON Web Token, предоставляемый приложением, для связи с Fleet Engine. Подробную информацию о токенах, ожидаемых сервером Fleet Engine, см. в разделах «JSON Web Tokens» и «Выдача JSON Web Tokens» .

Токен авторизации предоставляет доступ к следующим сервисам Fleet Engine:

  • TripService — предоставляет SDK потребителя доступ к подробной информации о поездке, включая местоположение транспортного средства, маршрут и расчетное время прибытия. Токены авторизации для сервиса поездок должны содержать утверждение tripid:TRIP_ID в заголовке authorization токена, где TRIP_ID — это идентификатор поездки по запросу, которой предоставляется доступ.

  • VehicleService — предоставляет Consumer SDK информацию о приблизительном местоположении транспортного средства для отображения слоя плотности транспортных средств и оценки времени прибытия в пункты посадки. Поскольку Consumer SDK использует только приблизительные местоположения, для авторизационных токенов для службы транспортных средств не требуется указывать идентификатор vehicleid .

Что такое токен?

Для вызова методов API из сред с низким уровнем доверия (смартфонов и браузеров) Fleet Engine требует использования JSON Web Tokens (JWT).

JWT-токен создается на вашем сервере, подписывается, шифруется и передается клиенту для последующих взаимодействий с сервером до тех пор, пока не истечет срок его действия или он не перестанет быть действительным.

Ключевые детали

Для получения дополнительной информации о JSON Web Tokens см. раздел «JSON Web Tokens» в руководстве Fleet Engine Essentials .

Как клиенты получают токены?

После того как водитель или пользователь войдет в ваше приложение, используя соответствующие учетные данные авторизации, любые обновления, выпущенные с этого устройства, должны использовать соответствующие токены авторизации, которые передают Fleet Engine информацию о разрешениях для приложения.

Как разработчик, вы должны обеспечить возможность выполнения следующих действий в клиентской части:

  • Получите JSON Web Token с вашего сервера.
  • Используйте токен повторно до истечения срока его действия, чтобы свести к минимуму количество обновлений токена.
  • Обновите токен по истечении срока его действия.

Класс AuthTokenFactory генерирует токены авторизации во время обновления местоположения. SDK должен упаковать токены вместе с информацией об обновлении для отправки в Fleet Engine. Убедитесь, что ваша серверная реализация может выдавать токены, прежде чем инициализировать SDK.

Подробную информацию об ожидаемых сервисом Fleet Engine токенах см. в разделе «Выдача JSON Web Tokens для Fleet Engine».

Пример программы для получения авторизационного токена.

Приведенный ниже пример кода демонстрирует, как реализовать функцию обратного вызова для токена авторизации.

Java

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
    }
  }
}

Что дальше?

Инициализируйте SDK потребителя.