Apa yang dimaksud dengan token?
Fleet Engine mewajibkan penggunaan Token Web JSON (JWT) untuk panggilan metode API dari lingkungan dengan tingkat kepercayaan rendah: smartphone dan browser.
JWT berasal dari server Anda, ditandatangani, dienkripsi, dan diteruskan ke klien untuk interaksi server berikutnya hingga masa berlakunya habis atau tidak lagi valid.
Detail utama
- Gunakan Kredensial Default Aplikasi untuk mengautentikasi dan memberi otorisasi terhadap Fleet Engine.
- Gunakan akun layanan yang sesuai untuk menandatangani JWT. Lihat peran akun layanan Fleet Engine di Dasar-Dasar Fleet Engine.
Untuk informasi selengkapnya tentang Token Web JSON, lihat Token Web JSON di Dasar-Dasar Fleet Engine.
Bagaimana cara klien mendapatkan token?
Setelah pengemudi atau konsumen login ke aplikasi Anda menggunakan kredensial otorisasi yang sesuai, setiap update yang dikeluarkan dari perangkat tersebut harus menggunakan token otorisasi yang sesuai, yang menyampaikan izin untuk aplikasi ke Fleet Engine.
Sebagai developer, implementasi klien Anda harus memberikan kemampuan untuk melakukan hal berikut:
- Ambil Token Web JSON dari server Anda.
- Gunakan kembali token hingga masa berlakunya habis untuk meminimalkan refresh token.
- Muat ulang token saat masa berlakunya habis.
Class AuthTokenFactory
menghasilkan token otorisasi pada waktu pembaruan lokasi. SDK harus memaketkan token dengan informasi
update yang akan dikirim ke Fleet Engine. Pastikan implementasi sisi server Anda dapat menerbitkan token sebelum melakukan inisialisasi SDK.
Untuk mengetahui detail token yang diharapkan oleh layanan Fleet Engine, lihat Mengeluarkan Token Web JSON untuk Fleet Engine.
Contoh pengambil token otorisasi
Berikut adalah implementasi kerangka 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);
}
}
}
Implementasi khusus ini menggunakan klien HTTP Java bawaan untuk mengambil token dalam format JSON dari server otorisasi. Klien menyimpan token untuk digunakan kembali dan mengambil ulang token jika token lama berada dalam waktu 10 menit dari waktu habis masa berlakunya.
Implementasi Anda mungkin melakukan hal-hal secara berbeda, seperti menggunakan thread latar belakang untuk memuat ulang token.
Untuk library klien yang tersedia untuk Fleet Engine, lihat Library klien untuk layanan tugas terjadwal.