什么是令牌?
对于从低信任环境进行的 API 方法调用,Fleet Engine 需要使用由相应服务账号签名的 JSON Web 令牌 (JWT)。低信任的环境包括智能手机和浏览器。JWT 源自您的服务器,即完全受信任的环境。系统会对 JWT 进行签名和加密,然后将其传递给客户端以进行后续服务器互动,直到 JWT 过期或失效。
您的后端应使用标准应用默认凭据机制对 Fleet Engine 进行身份验证和授权。请务必使用由相应服务账号签名的 JWT。如需查看服务账号角色的列表,请参阅 Fleet Engine 基础知识中的 Fleet Engine 服务账号角色。
相反,您的后端应使用标准应用默认凭据机制针对 Fleet Engine 进行身份验证和授权。
如需详细了解 JSON Web 令牌,请参阅 Fleet Engine 基础知识中的 JSON Web 令牌。
客户如何获取令牌?
司机或消费者使用适当的授权凭据登录您的应用后,从该设备发出的任何更新都必须使用适当的授权令牌,这些令牌会将应用的权限传达给 Fleet Engine。
作为开发者,您的客户端实现应能够执行以下操作:
- 从您的服务器提取 JSON Web 令牌。
- 在令牌过期之前重复使用,以最大限度地减少令牌刷新。
- 在令牌过期时刷新令牌。
AuthTokenFactory
类会在位置信息更新时生成授权令牌。SDK 必须将令牌与更新信息打包在一起,以发送到 Fleet Engine。在初始化 SDK 之前,请确保您的服务器端实现可以签发令牌。
如需详细了解 Fleet Engine 服务预期的令牌,请参阅为 Fleet Engine 颁发 JSON Web 令牌。
授权令牌提取器示例
下面是 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);
}
}
}
此特定实现使用内置 Java HTTP 客户端从授权服务器提取 JSON 格式的令牌。客户端会保存令牌以供重复使用,如果旧令牌距离过期时间不到 10 分钟,则会重新提取令牌。
您的实现可能会采用不同的方式执行操作,例如使用后台线程刷新令牌。
如需了解适用于车队引擎的客户端库,请参阅适用于随叫车服务的客户端库。