O SDK do consumidor oferece autorização usando JSON Web Tokens. Um token da Web JSON (JWT, na sigla em inglês) é 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 tokens JSON da Web.
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 hora prevista de chegada. Os tokens de autorização para o serviço de viagem precisam incluir uma declaraçãotripid:TRIP_ID
no cabeçalhoauthorization
do token, em queTRIP_ID
é o ID da viagem sob demanda 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 os horários de chegada do ponto de retirada. 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?
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. Os ambientes de baixa confiança incluem smartphones e navegadores. Um JWT é originado no servidor, que é um ambiente totalmente confiável. O JWT é assinado, criptografado e transmitido ao cliente para interações posteriores do servidor até expirar ou deixar de ser válido.
O back-end precisa autenticar e autorizar o Fleet Engine usando mecanismos padrão de credenciais padrão do aplicativo. Use JWTs assinados por uma conta de serviço adequada. Para uma lista de papéis de conta de serviço, consulte os papéis de conta de serviço do Fleet Engine em Noções básicas do Fleet Engine.
Por outro lado, o back-end precisa autenticar e autorizar o Fleet Engine usando mecanismos padrão de credenciais padrão do aplicativo.
Para mais informações sobre os tokens JSON da Web, consulte Tokens JSON da Web 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 apropriados, que comunicam ao Fleet Engine as permissões do app.
Como desenvolvedor, sua implementação de cliente precisa oferecer a capacidade de fazer o seguinte:
- Extraia 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
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
no 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 coletor de tokens 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
}
}
}