在使用 JavaScript 车队跟踪库之前,请确保您熟悉并已设置车队引擎。如需了解详情,请参阅 Fleet Engine。
本文档介绍了如何在网页应用和车队引擎之间启用授权。使用正确的授权令牌设置对车队引擎的请求后,您就可以在地图上跟踪车辆了。
设置授权
Fleet Engine 要求从低信任环境(智能手机和浏览器)进行 API 方法调用时,使用 JSON Web 令牌 (JWT)。
JWT 起源于您的服务器,经过签名和加密后传递给客户端,以便在到期或失效之前进行后续服务器互动。
关键详情
- 使用应用默认凭据对 Fleet Engine 进行身份验证和授权。
- 使用适当的服务账号为 JWT 签名。如需了解 Fleet Engine 服务账号角色,请参阅 Fleet Engine 基础知识。
授权的工作原理
使用车队引擎数据进行授权涉及服务器端和客户端实现。
服务器端授权
在您的车队跟踪应用中设置身份验证和授权之前,您的后端服务器必须能够向您的车队跟踪应用发出 JSON Web 令牌,以便访问车队引擎。您的车队跟踪应用会随请求一起发送这些 JWT,以便 Fleet Engine 将请求识别为已通过身份验证且有权访问请求中的数据。如需了解服务器端 JWT 实现的说明,请参阅车队引擎必备知识下的签发 JSON Web 令牌。
如需在实现车队跟踪时从服务器生成令牌,请参阅以下内容:- 有关发放 JSON Web 令牌的一般准则,包括有关按需行程和安排的任务的部分
- 随叫车行程:后端服务器操作的令牌示例
- 安排的任务:用于跟踪车队中所有任务和车辆的示例令牌
客户端授权
当您使用 JavaScript Fleet 跟踪库时,该库会使用授权令牌提取器从服务器请求令牌。当满足以下任一条件时,系统就会执行此操作:
不存在有效的令牌,例如当 SDK 未在新页面加载时调用提取器,或者提取器未返回令牌时。
令牌已过期。
令牌将在一分钟内过期。
否则,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,
};
}