Consumer SDK cung cấp quyền uỷ quyền bằng cách sử dụng Mã thông báo web JSON. Mã thông báo web JSON (JWT) là mã thông báo uỷ quyền cung cấp một hoặc nhiều xác nhận quyền sở hữu trên một dịch vụ.
Consumer SDK sử dụng Mã thông báo web JSON do ứng dụng cung cấp để giao tiếp với Fleet Engine. Để biết thông tin chi tiết về các mã thông báo mà máy chủ Fleet Engine mong đợi, hãy xem bài viết Mã thông báo web JSON và Phát hành mã thông báo web JSON.
Mã thông báo uỷ quyền cung cấp quyền truy cập vào các dịch vụ sau của Fleet Engine:
TripService– Cấp cho Consumer SDK quyền truy cập vào thông tin chi tiết về chuyến đi, bao gồm vị trí xe, tuyến đường và thời gian đến dự kiến. Mã thông báo uỷ quyền cho dịch vụ chuyến đi phải bao gồm xác nhận quyền sở hữutripid:TRIP_IDtrong tiêu đềauthorizationcủa mã thông báo, trong đóTRIP_IDlà mã chuyến đi của chuyến đi theo yêu cầu đang được chia sẻ.VehicleService– Cung cấp cho Consumer SDK thông tin về vị trí gần đúng của xe để hiển thị lớp mật độ xe và ước tính thời gian đến dự kiến tại điểm đón. Vì Consumer SDK chỉ sử dụng vị trí gần đúng, nên mã thông báo uỷ quyền cho dịch vụ xe không yêu cầu xác nhận quyền sở hữuvehicleid.
Mã thông báo là gì?
Fleet Engine yêu cầu sử dụng Mã thông báo web JSON (JWT) cho các lệnh gọi phương thức API từ môi trường có độ tin cậy thấp: đ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, được ký, mã hoá và chuyển đến máy khách cho các tương tác tiếp theo với máy chủ cho đến khi hết hạn hoặc không còn hợp lệ.
Thông tin chi tiết quan trọng
- Sử dụng Thông tin xác thực mặc định của ứng dụng để xác thực và uỷ quyền cho Fleet Engine.
- Sử dụng tài khoản dịch vụ thích hợp để ký JWT. Xem Vai trò của tài khoản dịch vụ Fleet Engine trong Thông tin cơ bản về Fleet Engine.
Để 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 Thông tin cơ bản về Fleet Engine.
Khách hàng nhận mã thông báo bằng cách nào?
Sau khi tài xế hoặc người tiêu dùng đăng nhập vào ứng dụng của bạn bằng thông tin đăng nhập uỷ quyền thích hợp, mọi bản cập nhật được phát hành từ thiết bị đó phải sử dụng mã thông báo uỷ quyền thích hợp. Mã thông báo này sẽ thông báo cho Fleet Engine về các quyền của ứng dụng.
Là nhà phát triển, quá trình triển khai máy khách của bạn phải cung cấp khả năng thực hiện những việc sau:
- Tìm nạp Mã thông báo web JSON từ máy chủ của bạn.
- Tái sử dụng mã thông báo cho đến khi hết hạn để giảm thiểu số lần làm mới mã thông báo.
- Làm mới mã thông báo khi hết hạn.
Lớp AuthTokenFactory tạo mã thông báo uỷ quyền tại thời điểm thông báo cập nhật vị trí. SDK phải đóng gói các mã thông báo bằng thông tin cập nhật để gửi đến Fleet Engine. Đảm bảo rằng quá trình triển khai 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 động SDK.
Để biết thông tin chi tiết về các mã thông báo mà dịch vụ Fleet Engine mong đợi, hãy xem bài viết Phát hành mã thông báo web JSON cho Fleet Engine.
Ví dụ về trình tìm nạp mã thông báo uỷ quyền
Ví dụ về mã sau đây minh hoạ cách triển khai lệnh gọi lại mã thông báo uỷ quyền.
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
}
}
}