Obtener tokens de autorización

¿Qué es un token?

Fleet Engine requiere el uso de tokens web JSON (JWT) para las llamadas a métodos de la API desde entornos de baja confianza: smartphones y navegadores.

Un JWT se origina en tu servidor, se firma, se encripta y se pasa al cliente para las interacciones posteriores del servidor hasta que vence o ya no es válido.

Detalles clave

Para obtener más información sobre los tokens web JSON, consulta Tokens web JSON en Conceptos básicos de Fleet Engine.

¿Cómo obtienen tokens los clientes?

Una vez que un conductor o consumidor accede a tu app con las credenciales de autorización adecuadas, todas las actualizaciones que se emitan desde ese dispositivo deben usar los tokens de autorización adecuados, que comunican a Fleet Engine los permisos de la app.

Como desarrollador, la implementación del cliente debe proporcionar la capacidad de hacer lo siguiente:

  • Recupera un token web JSON de tu servidor.
  • Reutiliza el token hasta que venza para minimizar las actualizaciones de tokens.
  • Actualiza el token cuando venza.

La clase AuthTokenFactory genera tokens de autorización en el momento de la actualización de la ubicación. El SDK debe empaquetar los tokens con la información de actualización para enviarlos a Fleet Engine. Asegúrate de que tu implementación del servidor pueda emitir tokens antes de inicializar el SDK.

Para obtener detalles sobre los tokens que espera el servicio de Fleet Engine, consulta Cómo emitir tokens web JSON para Fleet Engine.

Ejemplo de un buscador de tokens de autorización

A continuación, se muestra un esqueleto de implementación de un 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);
    }
  }
}

Esta implementación en particular usa el cliente HTTP de Java integrado para recuperar un token en formato JSON del servidor de autorización. El cliente guarda el token para volver a usarlo y lo vuelve a recuperar si el token anterior está a menos de 10 minutos de su hora de vencimiento.

Tu implementación puede hacer las cosas de manera diferente, como usar un subproceso en segundo plano para actualizar los tokens.

Para conocer las bibliotecas cliente disponibles para Fleet Engine, consulta Bibliotecas cliente para servicios de viajes a pedido.

¿Qué sigue?

Inicializa el SDK de Driver