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