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

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 .

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

Для вызовов методов API из сред с низким уровнем доверия Fleet Engine требует использования веб-токенов JSON (JWT), подписанных соответствующей учетной записью службы. К средам с низким уровнем доверия относятся смартфоны и браузеры. JWT создается на вашем сервере, который является полностью доверенной средой . JWT подписывается, шифруется и передается клиенту для последующего взаимодействия с сервером до тех пор, пока не истечет срок его действия или он не станет действительным.

Серверная часть должна аутентифицироваться и авторизоваться в Fleet Engine с использованием стандартных механизмов учетных данных приложения по умолчанию . Обязательно используйте JWT, подписанные соответствующей учетной записью службы. Список ролей сервисных учетных записей см. в разделе Роли сервисных учетных записей Fleet Engine в Основах 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
    }
  }
}

Что дальше

Инициализируйте потребительский SDK