设置 JavaScript 舰队跟踪库

在使用 JavaScript 车队跟踪库之前,请确保您熟悉并已设置车队引擎。如需了解详情,请参阅 Fleet Engine

本文档介绍了如何在网页应用和车队引擎之间启用授权。使用正确的授权令牌设置对车队引擎的请求后,您就可以在地图上跟踪车辆了。

设置授权

Fleet Engine 要求从低信任环境(智能手机和浏览器)进行 API 方法调用时,使用 JSON Web 令牌 (JWT)。

JWT 起源于您的服务器,经过签名和加密后传递给客户端,以便在到期或失效之前进行后续服务器互动。

关键详情

授权的工作原理

使用车队引擎数据进行授权涉及服务器端和客户端实现。

服务器端授权

在您的车队跟踪应用中设置身份验证和授权之前,您的后端服务器必须能够向您的车队跟踪应用发出 JSON Web 令牌,以便访问车队引擎。您的车队跟踪应用会随请求一起发送这些 JWT,以便 Fleet Engine 将请求识别为已通过身份验证且有权访问请求中的数据。如需了解服务器端 JWT 实现的说明,请参阅车队引擎必备知识下的签发 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,
  };
}

后续步骤