设置 JavaScript 舰队跟踪库

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

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

设置授权

对于从低信任环境进行的 API 方法调用,车队引擎要求使用由适当服务账号签名的 JSON Web 令牌 (JWT)。低信任环境包括智能手机和浏览器。JWT 源自您的服务器,即完全受信任的环境。JWT 会经过签名和加密,并传递给客户端以供后续与服务器的互动,直到其过期或失效为止。

您的后端应使用标准应用默认凭据机制对 Fleet Engine 进行身份验证和授权。请务必使用由适当服务账号签名的 JWT。如需查看服务账号角色列表,请参阅车队引擎基础知识中的车队引擎服务账号角色。

与之相反,您的后端应使用标准应用默认凭据机制对 Fleet Engine 进行身份验证和授权。

授权的工作原理

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

服务器端授权

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

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

客户端授权

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

  • 不存在有效的令牌,例如当 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,
  };
}

后续步骤