Mã thông báo là gì?
Fleet Engine yêu cầu sử dụng Mã thông báo web JSON (JWT) được ký bởi tài khoản dịch vụ thích hợp cho các lệnh gọi phương thức API từ độ tin cậy thấp môi trường. Môi trường đáng tin cậy thấp bao gồm điện thoại thông minh và trình duyệt. JWT bắt nguồn từ máy chủ của bạn – một môi trường hoàn toàn đáng tin cậy. JWT được ký, mã hoá và chuyển đến máy khách để máy chủ cho đến khi hết hạn hoặc không còn hợp lệ.
Phần phụ trợ của bạn phải xác thực và uỷ quyền dựa trên Fleet Engine bằng cách sử dụng cơ chế Thông tin đăng nhập mặc định của ứng dụng tiêu chuẩn. Nhãn hiệu sử dụng JWT đã được ký bằng một tài khoản dịch vụ thích hợp. Đối với danh sách vai trò trong tài khoản dịch vụ, hãy xem các vai trò trong tài khoản dịch vụ Fleet Engine trong Fleet Engine cơ bản.
Để biết thêm thông tin về Mã thông báo web JSON, hãy xem Mã thông báo web JSON trong Kiến thức cơ bản về động cơ cho phương tiện vận chuyển.
Khách hàng nhận mã thông báo bằng cách nào?
Sau khi người lái xe hoặc người dùng đăng nhập vào ứng dụng của bạn bằng thông tin xác thực uỷ quyền, mọi bản cập nhật phát hành qua thiết bị đó đều phải sử dụng mã thông báo uỷ quyền thích hợp để thông báo cho Fleet Engine cho ứng dụng.
Với tư cách là nhà phát triển, việc triển khai cho khách hàng của bạn phải giúp bạn có thể như sau:
- Tìm nạp Mã thông báo web JSON qua máy chủ của bạn.
- Hãy sử dụng lại mã thông báo cho đến khi hết hạn để giảm thiểu số lượt làm mới mã thông báo.
- Làm mới mã thông báo khi mã này hết hạn.
Lớp AuthTokenFactory
tạo mã thông báo uỷ quyền khi cập nhật vị trí
bất cứ lúc nào. SDK phải đóng gói mã thông báo bằng bản cập nhật
để gửi đến Fleet Engine. Đảm bảo rằng phía máy chủ của bạn
có thể phát hành mã thông báo trước khi khởi chạy SDK.
Để biết thông tin chi tiết về các mã thông báo cần có cho dịch vụ Fleet Engine, hãy xem bài viết Vấn đề JSON Web Tokens cho Fleet Engine.
Ví dụ về trình tìm nạp mã thông báo uỷ quyền
Dưới đây là cách triển khai khung của 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);
}
}
}
Cách triển khai cụ thể này sử dụng ứng dụng HTTP Java tích hợp sẵn để tìm nạp một mã thông báo ở định dạng JSON từ máy chủ uỷ quyền. Ứng dụng lưu mã thông báo để sử dụng lại và tìm nạp lại mã thông báo nếu mã thông báo cũ nằm trong vòng 10 phút kể từ khi thời gian hết hạn.
Quá trình triển khai của bạn có thể hoạt động theo cách khác, chẳng hạn như sử dụng luồng ở chế độ nền để làm mới mã thông báo.
Đối với các thư viện ứng dụng hiện có dành cho Fleet Engine, hãy xem Thư viện ứng dụng cho các dịch vụ chuyến đi theo yêu cầu.