O SDK do 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 do consumidor usa o JSON Web Token fornecido pelo aplicativo para se comunicar com o Fleet Engine. Para detalhes dos tokens esperados pelo servidor do Fleet Engine, consulte JSON Web Tokens e Emitir JSON Web Tokens.
O token de autorização fornece acesso aos seguintes serviços do Fleet Engine:
TripService: concede ao SDK do consumidor acesso aos detalhes da viagem, incluindo a posição do veículo, a rota e a previsão de chegada. Os tokens de autorização para o serviço de viagem precisam incluir uma declaraçãotripid:TRIP_IDno cabeçalhoauthorizationdo token, em queTRIP_IDé o ID da viagem sob demanda que está sendo compartilhada.VehicleService: fornece ao SDK do consumidor informações sobre a localização aproximada do veículo para exibir a camada de densidade do veículo e estimar as previsões de chegada do ponto de embarque. Como o SDK do consumidor usa apenas locais aproximados, os tokens de autorização para o serviço de veículo não exigem uma declaraçãovehicleid.
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
- Use Application Default Credentials para autenticar e autorizar o Fleet Engine.
- Use uma conta de serviço adequada para assinar JWTs. Consulte Papéis da conta de serviço do Fleet Engine em Noções básicas do Fleet Engine.
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.
- 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 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