在使用 JavaScript 舰队跟踪库之前,请确保您已经 并且已经设置了 Fleet Engine如需了解详情,请参阅 Fleet Engine。
本文档介绍了如何启用 网页应用和 Fleet Engine。您对 Fleet Engine 发出的请求 使用正确的授权令牌后,就可以 在地图上跟踪车辆。
设置授权
Fleet Engine 要求使用由适当服务账号签名的 JSON Web 令牌 (JWT) 来从低信任环境调用 API 方法。低信任的环境包括智能手机和浏览器。JWT 源自您的服务器,这是一个完全可信的环境。JWT 会经过签名和加密,并传递给客户端以供后续与服务器的互动,直到其过期或失效为止。
您的后端应使用 标准的应用默认凭据机制。制造商 请务必使用由相应服务账号签名的 JWT。对于 服务账号角色的列表,请参阅 Fleet Engine 服务账号角色 Fleet Engine 基础知识。
授权的工作原理
使用 Fleet Engine 数据进行授权涉及服务器端和客户端 实施。
服务器端授权
在舰队跟踪应用中设置授权之前,您的后端 服务器必须能够提供 JSON Web 令牌。这样一来,Fleet Engine 会将来自您应用的请求视为有权访问请求中的数据。有关服务器端 JWT 实现的说明,请参阅 在 Fleet Engine Essentials 下颁发 JSON Web 令牌。
要在实现舰队跟踪时从服务器生成令牌,请参阅 以下:- 关于颁发 JSON Web 令牌的一般准则,包括 按需行程和预定任务的部分
- 按需行程:后端服务器操作的示例令牌
- 计划任务:用于跟踪车队中所有任务和车辆的示例令牌
客户端授权
当您使用 JavaScript 舰队跟踪库时,它会使用 授权令牌提取程序。如果存在以下任一情况,系统便会执行此操作:
不存在有效的令牌,例如当 SDK 未在新页面加载时调用提取器,或者提取器未返回令牌时。
令牌已过期。
令牌将在 1 分钟内过期。
否则,JavaScript 舰队跟踪库会使用之前发放的有效令牌,并 不会调用提取程序。
创建授权令牌提取程序
请按照以下准则创建授权令牌提取程序:
提取器必须返回包含两个字段的数据结构,并将其封装在
Promise
中,如下所示:一个字符串
token
。数字
expiresInSeconds
。令牌会在提取后此时长过期。身份验证令牌提取器必须将从提取到库的时间(以秒为单位)传递给库,如示例所示。
抓取工具应调用您服务器上的网址来检索令牌。这个 网址(
SERVER_TOKEN_URL
)取决于您的后端实现。以下示例网址适用于 GitHub 上的示例应用后端:https://SERVER_URL/token/fleet_reader
示例 - 创建授权令牌提取程序
以下示例展示了如何创建授权令牌提取程序:
JavaScript
async function authTokenFetcher(options) {
// options is a record containing two keys called
// serviceType and context. The developer should
// generate the correct SERVER_TOKEN_URL and request
// based on the values of these fields.
const response = await fetch(SERVER_TOKEN_URL);
if (!response.ok) {
throw new Error(response.statusText);
}
const data = await response.json();
return {
token: data.Token,
expiresInSeconds: data.ExpiresInSeconds
};
}
TypeScript
function authTokenFetcher(options: {
serviceType: google.maps.journeySharing.FleetEngineServiceType,
context: google.maps.journeySharing.AuthTokenContext,
}): Promise<google.maps.journeySharing.AuthToken> {
// The developer should generate the correct
// SERVER_TOKEN_URL based on options.
const response = await fetch(SERVER_TOKEN_URL);
if (!response.ok) {
throw new Error(response.statusText);
}
const data = await response.json();
return {
token: data.token,
expiresInSeconds: data.ExpiresInSeconds,
};
}