Receber tokens de autorização

O SDK para consumidor fornece 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 para consumidor usa o JSON Web Token fornecido pelo aplicativo para para se comunicar com o Fleet Engine. Para detalhes sobre os tokens esperados pelo servidor do Fleet Engine, consulte JSON Web Tokens e Emitir tokens JSON da Web.

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

  • TripService: dá ao SDK do consumidor acesso a detalhes da viagem, incluindo: a posição do veículo, o trajeto e o HEC. Tokens de autorização para o serviço de viagem precisa incluir uma declaração tripid:TRIP_ID no cabeçalho authorization do token; em que TRIP_ID é o ID da viagem sob demanda que está sendo compartilhada.

  • VehicleService: fornece ao SDK do consumidor informações sobre o localização aproximada do veículo para exibir a camada de densidade do veículo; ao estimar HECs dos pontos de retirada. Como o SDK do consumidor usa apenas valores aproximados locais, os tokens de autorização para serviços de veículos não precisam de uma Reivindicação vehicleid.

O que é um token?

Para chamadas de método de API de ambientes de baixa confiança, o Fleet Engine exige o uso de JSON Web Tokens (JWTs) assinados por uma conta de serviço adequada. Ambientes de baixa confiança incluem smartphones e navegadores. Um JWT tem origem no seu servidor, que é um ambiente totalmente confiável. O JWT é assinado, criptografado e passado ao cliente para o próximo servidor interações até que expirem ou não sejam mais válidas.

Seu back-end deve autenticar e autorizar o Fleet Engine usando mecanismos padrão do Application Default Credentials. Marca use JWTs assinados por uma conta de serviço apropriada. Para um lista de papéis da conta de serviço, consulte os papéis da conta de serviço do Fleet Engine. em Noções básicas do mecanismo de frota.

Por outro lado, o back-end deve autenticar e autorizar no Fleet Engine usando o Application Default Credentials padrão de segurança.

Para saber mais sobre JSON Web Tokens, consulte JSON Web Tokens em Fundamentos do motor de frota.

Como os clientes recebem tokens?

Depois que um motorista ou consumidor faz login no aplicativo usando a credenciais de autorização, as atualizações emitidas por esse dispositivo devem usar tokens de autorização apropriados, que comunicam ao Fleet Engine o do app.

Como desenvolvedor, a implementação de seu cliente deve fornecer a capacidade de fazer o seguinte:

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

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

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

Exemplo de um coletor de tokens de autorização

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

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