Receber tokens de autorização

O que é um token?

O Fleet Engine exige o uso de JSON Web Tokens (JWTs) para chamadas de método de 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 do 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 Noções básicas 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 tokens de autorização adequados, que comunicam ao Fleet Engine as permissões do app.

Como desenvolvedor, a implementação do cliente precisa oferecer a capacidade de fazer o seguinte:

  • Buscar um JSON Web Token no seu servidor.
  • Reutilizar o token até que ele expire para minimizar as atualizações de token.
  • 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 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 dos tokens esperados pelo serviço do Fleet Engine, consulte Emitir JSON Web Tokens para o Fleet Engine.

Exemplo de um coletor de tokens de autorização

Confira uma implementação de esqueleto de um AuthTokenFactory:

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // initially null
  private long expiryTimeMs = 0;
  private String vehicleId;

  // This method is called on a thread whose only responsibility is to send
  // location updates. Blocking is OK, but just know that no location updates
  // can occur until this method returns.
  @Override
  public String getToken(AuthTokenContext authTokenContext) {
    String vehicleId = requireNonNull(context.getVehicleId());

    if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
      // The token has expired, go get a new one.
      fetchNewToken(vehicleId);
    }

    return vehicleServiceToken;
  }

  private void fetchNewToken(String vehicleId) {
    String url = "https://yourauthserver.example/token/" + vehicleId;

    try (Reader r = new InputStreamReader(new URL(url).openStream())) {
      com.google.gson.JsonObject obj
          = com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      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 10 minutes from that time.
      expiryTimeMs -= 10 * 60 * 1000;
      this.vehicleId = vehicleId;
    } catch (IOException e) {
      // It's OK to throw exceptions here. The StatusListener you passed to
      // create the DriverContext class will be notified and passed along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

Essa implementação específica usa o cliente HTTP Java integrado para buscar um token no formato JSON do servidor de autorização. O cliente salva o token para reutilização e o busca novamente se o token antigo estiver a 10 minutos do tempo de expiração.

Sua implementação pode fazer coisas diferentes, como usar uma linha de execução em segundo plano para atualizar tokens.

Para as bibliotecas de cliente disponíveis para o Fleet Engine, consulte Bibliotecas de cliente para serviços de tarefas programadas.

A seguir

Inicializar o SDK do Driver