Émettre des jetons Web JSON

Ce document explique comment émettre des jetons Web JSON pour permettre à vos applications Web et mobiles d'accéder aux données Fleet Engine. Si vous ne l'avez pas encore fait, lisez Jetons Web JSON dans la section Sécurité dans Fleet Engine. Avec le service Fleet Engine, vous pouvez émettre des jetons JWT de l'une des manières suivantes :

  • Utilisez la bibliothèque d'autorisation : Google vous recommande d'utiliser cette approche lorsque votre base de code est écrite en Java. Cette bibliothèque gère l'émission de JWT pour tous les scénarios d'utilisation dont vous pourriez avoir besoin avec le service et simplifie considérablement votre implémentation.
  • Créez vos propres jetons JWT : si vous ne pouvez pas utiliser notre bibliothèque JWT, vous devrez les intégrer à votre propre code. Cette section fournit différents exemples de JWT pour chaque scénario.

Fonctionnement des jetons JWT

Pour les environnements non approuvés, tels que les téléphones mobiles et les navigateurs Web, votre serveur backend émet des JWT qui fonctionnent comme suit :

  • Votre code client s'exécutant dans un environnement à faible niveau de confiance appelle votre code serveur s'exécutant dans un environnement à niveau de confiance élevé pour demander le jeton JWT approprié à transmettre à Fleet Engine.

  • Les jetons JWT sont associés à des comptes de service. Par conséquent, les requêtes envoyées à Fleet Engine sont implicitement associées au compte de service qui a signé le jeton JWT.

  • Les revendications JWT limitent davantage les ressources sur lesquelles le client peut agir, comme des véhicules, des trajets ou des tâches spécifiques.

Utiliser la bibliothèque d'autorisation pour Java

Pour utiliser la bibliothèque d'autorisation Fleet Engine pour Java, accédez au dépôt GitHub. La bibliothèque simplifie la création de jetons Web JSON (JWT) Fleet Engine et les signe de manière sécurisée. Il fournit les éléments suivants :

  • Déclarations de dépendances du projet
  • Liste complète de tous les rôles de compte de service pour les trajets à la demande ou les tâches planifiées
  • Mécanismes de signature de jetons autres que l'utilisation de fichiers d'identifiants, tels que l'usurpation d'un compte de service
  • Associe des jetons signés aux requêtes sortantes effectuées à partir d'un stub gRPC ou d'une bibliothèque cliente Google API Codegen (GAPIC)
  • Instructions pour intégrer les signataires aux bibliothèques clientes Fleet Engine

Si vous émettez des jetons JWT à partir de votre code

Si vous ne pouvez pas utiliser la bibliothèque d'autorisation pour Java, vous devez implémenter les jetons JWT dans votre propre code. Cette section fournit quelques consignes pour créer vos propres jetons. Pour obtenir la liste des champs et des revendications JWT, consultez Jetons Web JSON dans la section Sécurité dans Fleet Engine. Consultez la section Rôles des comptes de service pour connaître les rôles des comptes de service utilisés par Fleet Engine. Consultez la section suivante pour obtenir une liste d'exemples de jetons JWT pour les trajets à la demande ou les tâches planifiées.

Consignes générales

  • Utilisez les comptes de service et les rôles appropriés. Le compte de service et le rôle associé garantissent que l'utilisateur qui demande le jeton est autorisé à afficher les informations auxquelles le jeton lui donne accès. Plus précisément :
    • Si vous signez un jeton JWT à transmettre à un appareil mobile, utilisez le compte de service pour le rôle SDK Driver ou Consumer. Sinon, l'appareil mobile peut modifier des données auxquelles il ne devrait pas avoir accès et y accéder.
    • Si vous signez le jeton JWT à utiliser pour les appels privilégiés, utilisez le compte de service avec le rôle Administrateur Fleet Engine approprié lorsque vous utilisez les ADC ou les jetons JWT. Sinon, l'opération échoue.
  • Ne partagez que les jetons créés. Ne partagez jamais les identifiants utilisés pour créer les jetons.
  • Pour les appels gRPC, le mécanisme d'association du jeton dépend du langage et du framework utilisés pour effectuer l'appel. Le mécanisme permettant de spécifier un jeton pour un appel HTTP consiste à inclure un en-tête Authorization avec un jeton du porteur dont la valeur est le jeton.
  • Renvoie un délai d'expiration. Votre serveur doit renvoyer un délai d'expiration pour le jeton, généralement en secondes.
  • Si vous devez créer et signer un fichier JSON directement en tant que jeton de support, plutôt que d'utiliser des jetons d'accès OAuth 2.0, consultez les instructions pour l'autorisation de compte de service sans OAuth dans la documentation Identity Developer.

Pour les trajets à la demande

  • Lorsque vous créez la charge utile JWT, ajoutez une revendication supplémentaire dans la section d'autorisation avec la clé vehicleid ou tripid définie sur la valeur de l'ID du véhicule ou de l'ID du trajet pour lequel l'appel est effectué.

Pour les tâches planifiées

  • Lorsque votre serveur appelle d'autres API, les jetons doivent également contenir la revendication appropriée. Pour ce faire, vous pouvez procéder comme suit :
    • Définissez la valeur de chaque clé sur *.
    • Accordez à l'utilisateur l'accès à tous les taskids et deliveryvehicleids. Pour ce faire, vous devez ajouter une revendication supplémentaire dans la section d'autorisation avec les clés taskid et deliveryvehicleid.
    • Lorsque vous utilisez l'astérisque (*) dans la revendication taskids, il doit s'agir du seul élément du tableau.

Exemples de JWT pour les trajets à la demande

Cette section fournit des exemples de JWT pour les scénarios courants si vous utilisez des trajets à la demande.

Exemple de jeton pour une opération d'application de chauffeur

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_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": {
     "vehicleid": "driver_12345"
   }
}

Exemple de jeton pour une opération d'application consommateur

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_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": {
     "tripid": "trip_54321"
   }
}

Exemples de JWT pour les tâches planifiées

Cette section fournit un exemple de JWT pour les scénarios typiques si vous utilisez des tâches planifiées.

Exemple de jeton pour une application de chauffeur

    {
      "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"
       }
    }

Exemple de jeton pour une application grand public

    {
      "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"
       }
    }

Exemples de JWT pour les opérations de parc

Cette section fournit un exemple de JWT pour un scénario typique d'opérations de flotte.

Exemple de jeton permettant de suivre toutes les tâches et tous les véhicules d'une flotte

L'exemple suivant est un jeton qui suit toutes les tâches et tous les véhicules de la flotte à partir d'une application Web utilisée par un opérateur. Les autorisations requises pour ces opérations sont supérieures à celles des applications clientes. Consultez Configurer la bibliothèque JavaScript Fleet Tracking pour l'implémentation côté client qui utiliserait ce jeton :

  • Signez le jeton à l'aide du rôle Fleet Engine Delivery Fleet Reader Cloud IAM.

   {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_consumer_service_account"
    }
    .
    {
      "iss": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "sub": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "scope": "https://www.googleapis.com/auth/xapi",
      "authorization": {
         "taskid": "*",
         "deliveryvehicleid": "*",
       }
    }

Autre méthode d'authentification pour les opérations de serveur de backend

Google vous recommande d'utiliser ADC pour authentifier les opérations du serveur de backend. Si vous ne pouvez pas utiliser ADC et que vous devez utiliser des jetons JWT, consultez ces exemples.

Exemple de jeton pour une opération de serveur de backend à la demande

  {
    "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": {
       "vehicleid": "*",
       "tripid": "*"
     }
  }
  

Exemple de jeton pour une opération planifiée sur un serveur de backend

    {
      "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": "*"
       }
    }
   

Exemple de jeton pour une opération de création par lot de tâches de serveur de backend planifiée

    {
      "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": ["*"]
       }
    }
  

Exemple de jeton pour une opération planifiée sur un serveur de backend par véhicule de livraison

    {
      "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": "*"
       }
    }
  

Étape suivante

  • Vérifiez votre configuration pour pouvoir créer un véhicule d'essai et vous assurer que vos jetons fonctionnent comme prévu.
  • Pour savoir comment utiliser les identifiants par défaut de l'application au lieu des jetons JWT pour les opérations de serveur de backend, consultez la présentation de la sécurité.