设置 JavaScript 舰队跟踪库

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

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

设置授权

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

JWT 源自您的服务器,经过签名、加密并传递给客户端 以供后续服务器交互使用,直到过期或失效为止。

关键详情

授权的工作原理是什么?

使用 Fleet Engine 数据进行授权涉及服务器端和客户端 实现。

服务器端授权

在 Fleet 跟踪 应用中设置身份验证和授权之前,后端服务器必须能够向您的 Fleet 跟踪应用颁发 JSON Web 令牌,以便访问 Fleet Engine。Fleet 跟踪应用 会随请求发送这些 JWT,以便 Fleet Engine 将请求识别为 经过身份验证并已获授权访问 请求中的数据。如需了解服务器端 JWT 实现方面的说明,请参阅 颁发 JSON Web 令牌 下的 Fleet Engine 基础知识

如需在实现 Fleet 跟踪时从服务器生成令牌,请参阅以下内容:

客户端授权

当您使用 JavaScript Fleet 跟踪库时,该库会使用 授权令牌提取器从服务器请求令牌。在满足以下任一条件时,该库会执行此操作:

  • 不存在有效令牌,例如,当 SDK 在 新页面加载时未调用提取器,或者提取器未返回令牌时。

  • 令牌已过期。

  • 令牌距离过期时间不到一分钟。

否则,JavaScript Fleet 跟踪库会使用之前颁发的有效令牌,并且不会 调用提取器。

创建授权令牌提取器

请按照以下准则创建授权令牌提取器:

  • 提取器必须返回包含两个字段的数据结构,并封装在 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,
  };
}

后续步骤