Receber tokens de autorização

O SDK do consumidor oferece autorização usando JSON Web Tokens. Um JSON Web Token (JWT) é um token de autorização que fornece uma ou mais declarações em um serviço.

O SDK do consumidor usa o JSON Web Token fornecido pelo aplicativo para se comunicar com o Fleet Engine. Para detalhes sobre os tokens esperados pelo servidor do Fleet Engine, consulte JSON Web Tokens e Emitir JSON Web Tokens.

O token de autorização dá acesso aos seguintes serviços do Fleet Engine:

  • TripService: dá ao SDK do consumidor acesso aos detalhes da viagem, incluindo posição do veículo, rota e ETA. Os tokens de autorização para o serviço de viagem precisam incluir uma declaração tripid:TRIP_ID no cabeçalho authorization do token, em que TRIP_ID é o ID da viagem por demanda compartilhada.

  • VehicleService: fornece ao SDK do consumidor informações sobre a localização aproximada do veículo para mostrar a camada de densidade de veículos e estimar os horários de chegada previstos do ponto de encontro. Como o SDK Consumer usa apenas locais aproximados, os tokens de autorização para o serviço de veículo não exigem uma declaração vehicleid.

O que é um token?

O Fleet Engine exige o uso de JSON Web Tokens (JWTs) para chamadas de método da API de ambientes de baixa confiança: smartphones e navegadores.

Um JWT é originado no seu servidor, assinado, criptografado e transmitido ao cliente para interações subsequentes com o servidor até expirar ou não ser mais válido.

Detalhes importantes

Para mais informações sobre JSON Web Tokens, consulte JSON Web Tokens em Fundamentos do Fleet Engine.

Como os clientes recebem tokens?

Depois que um motorista ou consumidor faz login no seu app usando as credenciais de autorização adequadas, todas as atualizações emitidas desse dispositivo precisam usar os tokens de autorização adequados, que comunicam ao Fleet Engine as permissões do app.

Como desenvolvedor, a implementação do cliente precisa permitir o seguinte:

  • Busque um JSON Web Token do seu servidor.
  • Reutilize o token até que ele expire para minimizar as atualizações.
  • Atualize o token quando ele expirar.

A classe AuthTokenFactory gera tokens de autorização no momento da atualização da localização. O SDK precisa empacotar os tokens com as informações de atualização para enviar ao Fleet Engine. Verifique se a implementação do lado do servidor pode emitir tokens antes de inicializar o SDK.

Para detalhes sobre os tokens esperados pelo serviço do Fleet Engine, consulte Emitir tokens JSON da Web para o Fleet Engine.

Exemplo de um buscador de token de autorização

O exemplo de código a seguir demonstra como implementar um callback de token de autorização.

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

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

A seguir

Inicializar o SDK do consumidor