身份验证与授权

本部分介绍了 与 Fleet Engine 的集成。

您可以通过 Google Cloud 控制台。Fleet Engine SDK 需要使用已由 相应的服务 账号

概览

对 Fleet Engine 进行身份验证和授权的客户后端应使用 标准应用程序默认值 凭据 机制。

Fleet Engine 还会接收来自低信任环境的调用 例如智能手机和浏览器仅保护服务账号密钥 适合受信任的环境,预计会生成 已签名的 JSON Web 令牌 (JWT) 以及特定于 Fleet Engine 的其他声明 然后可以将其发布到不受信任的环境,例如手机。

身份验证设计原则

Fleet Engine 的身份验证流程融合了以下设计原则。

  • IAM 角色定义 针对主账号允许的资源的一组权限。例如, Admin 角色可通过 Application Default 执行所有操作 凭据,而不受信任的 Driver* 角色只能更新 并且仅限使用 JWT 进行身份验证和 授权。

  • 对于不受信任的环境,JWT 声明会进一步限制 调用程序可以执行的操作。任务可以是特定任务,也可以是送货车辆。

  • 在低信任环境中运行的代码必须先调用 在可信环境中运行的代码来发出 JWT。

  • Fleet Engine 会对 API 调用执行以下安全检查,以确保 资源:

    1. 调用方主账号具有适当的权限(通过角色) 分配)。

    2. 对于非管理员角色,请求中传递的 JWT 声明会提供 获取这项资源的必要权限。

身份验证流程

以下序列图展示了这些身份验证流程的详细信息。

  1. 舰队管理员会创建服务账号。

  2. 舰队管理员会为服务账号分配特定的 IAM 角色。

  3. 舰队管理员使用服务账号配置其后端 和应用默认凭据

  4. 客户端应用从客户后端请求 JWT。请求者可以 是驾驶应用、消费者应用或监控应用。

  5. 客户后端为相应服务签名并颁发 JWT 。客户端应用接收 JWT。

  6. 客户端应用使用 JWT 连接到 Fleet Engine 以读取或修改 数据,具体取决于在设置阶段分配给它的 IAM 角色。

身份验证序列图

Cloud 项目设置

要设置云项目,请先创建项目,然后 创建服务账号。

如需创建 Google Cloud 项目,请执行以下操作:

  1. 使用 Google Cloud 控制台创建 Google Cloud 项目。
  2. 使用 API 和服务信息中心,启用 Local Rides and Deliveries API。

服务账号和IAM 角色

服务账号是 由应用(而不是个人)使用的特殊账号。 通常,服务账号用于创建 JWT,向不同用户 授予的权限集。为了降低滥用的可能性 您可以创建多个服务账号,并为每个账号分配一组最低数量的角色 必填()。

最后一英里 Fleet 解决方案使用以下角色:

角色说明
Fleet Engine Delivery 可信驾驶员用户

roles/fleetengine.deliveryTrustedDriver
授予创建和更新送货车辆和任务的权限, 包括更新送货车辆的位置和任务状态 或结果。由具有此角色的服务账号创建的令牌 通常是在送货司机的移动设备上使用, 与后端服务器通信
Fleet Engine Delivery 不受信任的驾驶员用户

roles/fleetengine.deliveryUntrustedDriver
授予更新送货车辆位置的权限。已铸造的代币 通常用于您的交付 驾驶员的移动设备。
Fleet Engine Delivery 消费者用户

roles/fleetengine.deliveryConsumer
授予使用跟踪 ID 搜索任务的权限, 以及读取但不更新任务信息。已铸造的代币 通常由具有此角色的服务账号使用 用户的网络浏览器。
Fleet Engine Delivery Admin

roles/fleetengine.deliveryAdmin
授予对传送资源的读写权限。主账号 则不需要使用 JWT,而应使用 Application 默认凭据。自定义 JWT 声明会被忽略。此角色应 仅限受信任的环境(客户后端)。
Fleet Engine Delivery Super User **(已弃用)**

roles/fleetengine.deliverySuperUser
授予对所有交付车辆和任务 API 的权限。已铸造的代币 通常从您的后端使用。 服务器
Fleet Engine Delivery Fleet Reader

roles/fleetengine.deliveryFleetReader
授予读取送货车辆和任务以及搜索 使用跟踪 ID 来执行任务。由服务账号创建的具有此令牌的令牌 角色通常在配送舰队运营商的网络浏览器中使用。

为配送司机提供 企业 IT 可以充分利用 Fleet Engine 提供的灵活性 “Trusted Driver User”角色,并选择集成部分或全部 Fleet Engine 在移动应用中进行的互动

支持自带设备政策的组织应选择 Fleet Engine Untrusted Driver User 角色安全,并且仅依赖于 移动应用向 Fleet Engine 发送车辆位置信息更新。所有其他 互动都应来自客户后端服务器。

驱动程序 SDK 和使用方 SDK 是围绕这些标准角色构建的。 不过,您可以创建自定义角色 允许将任意一组权限捆绑在一起。 在以下情况下,驱动程序 SDK 和使用方 SDK 将显示错误消息: 缺少必需的权限。因此,我们强烈建议 并使用上述一组标准角色(而不是自定义角色)。

创建服务账号

您可以使用 IAM & Admin > Service Accounts 创建服务账号。 标签页。从“角色”下拉列表中选择 Fleet Engine 并为服务账号分配其中一个角色。不错 来指明与每个角色关联的账号。 例如,为服务账号指定一个含义明确的名称。

为方便起见,如果您需要为不受信任的客户端创建 JWT,请将 Service Account Token Creator 角色的用户可创建令牌 使用 gcloud 命令行工具

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

其中,my-user@example.com 是用于 使用 gcloud (gcloud auth list --format='value(account)') 进行身份验证。

Fleet Engine 身份验证库

Fleet Engine 使用 JWT 来限制对不受信任的系统中 Fleet Engine API 的访问 环境Fleet Engine Auth Library GitHub,简化了 构建 Fleet Engine JWT 并进行安全签名。

该库具有以下优势:

  • 简化了创建 Fleet Engine 令牌的流程。
  • 提供除使用凭据文件以外的令牌签名机制(例如 模拟服务账号。)

创建用于授权的 JSON Web 令牌 (JWT)

如果不使用 Fleet Engine Auth 库,JWT 必须为 直接在代码库中编写代码这就需要您具备深厚的 了解 JWT 及其与 Fleet Engine 的关系。正因如此, 强烈建议充分利用 Fleet Engine Auth 库。

在 Fleet Engine 中,JWT 提供短期有效的身份验证 并确保设备只能出于特定目的修改车辆或任务 并向其授权JWT 包含标头和声明部分。 标头部分包含 要使用的私钥(从服务账号获取)和加密 算法。声明部分包含 令牌的创建时间、令牌的存留时间、 声明访问权限,以及其他授权信息以缩小范围 访问权限;例如送货车辆 ID。

JWT 标头部分包含以下字段:

字段说明
alg 要使用的算法。`RS256`。
typ 令牌的类型。“JWT”。
kid 您的服务账号的私钥 ID。您可以找到 。 请务必使用具有正确权限级别的服务账号中的密钥。

JWT 声明部分包含以下字段:

字段说明
iss 您的服务账号的电子邮件地址。
sub 您的服务账号的电子邮件地址。
aud 您的服务账号的 SERVICE_NAME,在本示例中为 https://fleetengine.googleapis.com/
iat 令牌创建时的时间戳(以秒为单位表示) 自 1970 年 1 月 1 日 00:00:00(世界协调时间)起。等待 10 分钟,使数据出现偏差。如果 时间戳过于久远或在未来,服务器可能会报告错误。
exp 令牌到期时的时间戳(以秒为单位表示) 自 1970 年 1 月 1 日 00:00:00(世界协调时间)起。如果时间戳为 1 个小时以后
authorization 可能包含 `deliveryvehicleid`、`trackingid`、`taskid` 或 `taskids`。

创建 JWT 令牌意味着对其进行签名。如需查看相关说明和代码示例 有关创建和签署 JWT 的说明,请参阅 不使用 OAuth 的服务账号授权。 然后,您可以将创建的令牌附加到 gRPC 调用或所用的其他方法 访问 Fleet Engine。

JWT 声明

最后一英里舰队解决方案使用私密声明。使用私有声明可以确保 授权的客户端可以访问自己的数据。例如,当您的后端 为送餐司机的移动设备发出 JSON 网络令牌,该令牌应该 包含 deliveryvehicleid 声明和该司机送货价值 车辆 ID。然后,根据驾驶员角色,令牌只会为 具体的交付车辆 ID,而不是任何其他任意车辆 ID。

最后一英里舰队解决方案使用以下私有声明:

  • deliveryvehicleid - 调用按交付车辆的 API 时使用。
  • taskid - 调用按任务划分的 API 时使用。
  • taskids - 调用 BatchCreateTasksAPI 时使用。此声明必须 且该数组应包含执行上述操作所需的所有任务 ID 完成相应请求不得包含 delivervehicleidtrackingidtaskid 项版权主张。
  • trackingid - 调用 GetTaskTrackingInfoAPI 时使用。版权主张必须 与请求中的跟踪 ID 匹配。请勿包含delivervehicleidtaskidtaskids声明。

调用 API 时,令牌还必须包含相应的声明 但您可以使用星号 (“*”)用于 deliveryvehicleidtaskidtrackingid 声明。星号 (“*”)也可用在 taskids 声明中,但它必须是唯一的元素 。

如果您想直接创建 JSON 并作为令牌不记名者对 JSON 进行签名, 使用 OAuth 2.0 访问令牌,请阅读 不使用 OAuth 的服务账号授权

将令牌附加到 gRPC 调用的机制取决于语言 以及用于进行调用的框架。用于指定令牌的机制 添加带有不记名令牌的授权标头 其值就是令牌,如 货运跟踪舰队性能 用例。

以下示例展示了来自您的 后端服务器:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskid": "*"
       }
    }

以下示例展示了从 Google Cloud 控制台执行批量创建任务操作的令牌, 后端服务器:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskids": ["*"]
       }
    }

以下示例显示了从 您的后端服务器:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "*"
       }
    }

以下示例展示了最终用户客户的令牌:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_consumer_service_account"
    }
    .
    {
      "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "trackingid": "shipment_12345"
       }
    }

以下示例展示了您的驱动程序应用的令牌:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_driver_service_account"
    }
    .
    {
      "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
      "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "driver_12345"
       }
    }
  • 对于标头中的 kid 字段,请指定您的服务账号的专用 密钥 ID。您可以在private_key_id 服务账号 JSON 文件。
  • 对于 isssub 字段,请指定您的服务账号的电子邮件地址。 您可以在服务账号的 client_email 字段中找到此值 JSON 文件。
  • 对于 aud 字段,请指定 https://SERVICE_NAME/
  • 对于 iat 字段,请指定创建令牌时的时间戳。 以世界协调时间 (UTC) 1970 年 1 月 1 日 00:00:00 以来经过的秒数。等待 10 分钟 用于调整偏差。如果时间戳过于久远或将来, 服务器可能会报告错误。
  • 对于 exp 字段,指定令牌到期时的时间戳。 自 1970 年 1 月 1 日 00:00:00 世界协调时间 (UTC) 开始计算的秒数。推荐值 为 iat + 3600。

在签署要传递给移动设备或最终用户的令牌时,请确保 使用“送货司机”或“消费者”角色的凭据文件。否则 移动设备或最终用户将可以更改或查看 无法访问某些信息