Authentification et autorisation

Cette section explique les concepts d'authentification et d'autorisation dans le cadre de la mise en œuvre de Fleet Engine. Il décrit les procédures à suivre pour sécuriser vos appels de fonction Fleet Engine.

Vous pouvez configurer les fonctionnalités fournies par Last Mile Fleet Solution via la console Google Cloud. Ces API et SDK nécessitent l'utilisation de jetons Web JSON (JWT) qui ont été signés à l'aide de comptes de service créés dans Cloud Console.

Présentation

Dans le cadre de son mécanisme d'autorisation, Fleet Engine offre une sécurité supplémentaire contre les appels provenant d'environnements peu fiables. Les environnements peu fiables incluent les smartphones et les navigateurs. De plus, Fleet Engine applique le principe du moindre privilège, selon lequel un appel ne doit recevoir que les droits nécessaires à l'exécution de sa tâche.

Pour protéger les appels de fonction provenant d'environnements à faible confiance, Google a conçu un mécanisme dans lequel votre code crée un jeton sur votre serveur backend, qui est un environnement entièrement approuvé. Chaque appel comporte une description de sécurité complète, qui est ensuite chiffrée dans un jeton JWT que vous transmettez avec l'appel depuis n'importe quel environnement.

Principes de conception de l'authentification

Le flux d'authentification de Fleet Engine intègre les principes de conception suivants.

  • Les rôles IAM définissent le champ d'application de l'activité autorisée pour l'appelant. Par exemple, le rôle SuperUser est autorisé à effectuer toutes les opérations, tandis que le rôle Untrusted Driver n'est autorisé qu'à effectuer des mises à jour minimales de la position.

  • Les rôles IAM sont associés aux comptes de service.

  • Les revendications JWT limitent davantage les entités sur lesquelles l'appelant peut effectuer des opérations. Il peut s'agir de tâches spécifiques ou de véhicules de livraison.

  • Les requêtes envoyées à Fleet Engine contiennent toujours un jeton JWT.

    • Les jetons JWT étant associés à des comptes de service, les requêtes envoyées à Fleet Engine sont implicitement associées au compte de service qui leur est associé.
  • Pour demander le jeton JWT approprié que vous pouvez ensuite transmettre à Fleet Engine, le code exécuté dans un environnement à faible confiance doit d'abord appeler le code exécuté dans un environnement entièrement approuvé.

  • Fleet Engine effectue les contrôles de sécurité suivants:

    1. Les rôles IAM associés au compte de service fournissent à l'appelant l'autorisation appropriée pour émettre l'appel d'API.

    2. Les revendications JWT transmises dans la requête fournissent à l'appelant l'autorisation appropriée pour effectuer des opérations sur l'entité.

Flux d'authentification

Le schéma séquentiel suivant illustre les détails du flux d'authentification.

  1. L'administrateur du parc crée les comptes de service.

  2. L'administrateur du parc attribue des rôles IAM spécifiques aux comptes de service.

  3. L'administrateur du parc configure le backend avec les comptes de service.

  4. L'application cliente demande un jeton JWT au backend du partenaire. Le demandeur peut être l'application Pilote, l'application grand public ou une application de surveillance.

  5. Fleet Engine émet un jeton JWT pour le compte de service correspondant. L'application cliente reçoit le jeton JWT.

  6. L'application cliente utilise le jeton JWT pour se connecter à Fleet Engine afin de lire ou de modifier des données, en fonction des rôles IAM qui lui ont été attribués lors de la phase de configuration.

Schéma de la séquence d'authentification

Configurer un projet Cloud

Pour configurer votre projet cloud, commencez par créer votre projet, puis créez des comptes de service.

Pour créer votre projet Google Cloud, procédez comme suit:

  1. Créer un projet Google Cloud à l'aide de la console Google Cloud
  2. À l'aide du tableau de bord des API et des services, activez l'API Local Rides and Deliveries.

Comptes de service et rôles IAM

Un compte de service est un type particulier de compte utilisé par une application plutôt que par une personne. En règle générale, un compte de service est utilisé pour créer des jetons JWT qui accordent différents ensembles d'autorisations en fonction du rôle. Pour réduire le risque d'abus, vous pouvez créer plusieurs comptes de service, chacun avec l'ensemble minimal de rôles requis.

Last Mile Fleet Solution utilise les rôles suivants:

RôleDescription
Utilisateur de confiance Fleet Engine Delivery

roles/fleetengine.deliveryTrustedDriver
Permet de créer et de mettre à jour des tâches et des véhicules de livraison, y compris de mettre à jour l'emplacement du véhicule de livraison et l'état ou le résultat des tâches. Les jetons générés par un compte de service doté de ce rôle sont généralement utilisés à partir des appareils mobiles de votre livreur ou de vos serveurs backend.
Utilisateur non approuvé Fleet Engine Delivery

roles/fleetengine.deliveryUntrustedDriver
Accorde l'autorisation de mettre à jour l'emplacement du véhicule de livraison. Les jetons générés par un compte de service avec ce rôle sont généralement utilisés à partir des appareils mobiles de votre livreur.
Utilisateur consommateur Fleet Engine Delivery

roles/fleetengine.deliveryConsumer
Octroie l'autorisation de rechercher des tâches à l'aide d'un ID de suivi et de lire les informations sur les tâches, mais pas de les mettre à jour. Les jetons générés par un compte de service doté de ce rôle sont généralement utilisés à partir du navigateur Web d'un consommateur.
Super-utilisateur Fleet Engine Delivery

roles/fleetengine.deliverySuperUser
Accorde l'autorisation à toutes les API de tâches et de véhicules de livraison. Les jetons générés par un compte de service doté de ce rôle sont généralement utilisés à partir de vos serveurs backend.
Lecteur de parc Fleet Engine Delivery

roles/fleetengine.deliveryFleetReader
Permet de lire les tâches et les véhicules de livraison, et de rechercher des tâches à l'aide d'un ID de suivi. Les jetons générés par un compte de service doté de ce rôle sont généralement utilisés à partir du navigateur Web d'un opérateur de flotte de livraisons.

Les entreprises qui fournissent à leurs livreurs des appareils gérés par le service informatique peuvent profiter de la flexibilité offerte par le rôle Utilisateur de confiance Fleet Engine et choisir d'intégrer tout ou partie des interactions Fleet Engine dans l'application mobile.

Les organisations qui acceptent les règles d'utilisation de votre propre appareil doivent garantir la sécurité du rôle "Conducteur non approuvé Fleet Engine" et ne faire appel qu'à l'application mobile pour envoyer les mises à jour de la position des véhicules à Fleet Engine. Toutes les autres interactions doivent provenir des serveurs backend du client.

Les SDK pilote et client s'articulent autour de ces rôles standards. Cependant, il est possible de créer des rôles personnalisés permettant de regrouper un ensemble arbitraire d'autorisations. Les SDK Driver et grand public affichent des messages d'erreur lorsqu'une autorisation requise est manquante. Par conséquent, nous vous recommandons vivement d'utiliser l'ensemble de rôles standard présenté ci-dessus plutôt que les rôles personnalisés.

Créer un compte de service

Vous pouvez créer un compte de service à l'aide de l'onglet IAM & Admin > Service Accounts de la console Google Cloud. Dans la liste déroulante "Rôle", sélectionnez Fleet Engine et attribuez l'un des rôles au compte de service. Il est recommandé d'indiquer le compte associé à chaque rôle. Par exemple, attribuez un nom explicite au compte de service.

Pour plus de commodité, si vous devez générer des jetons JWT pour des clients non approuvés, l'ajout d'utilisateurs au rôle Créateur de jetons du compte de service leur permet de générer des jetons à l'aide des outils de ligne de commande gcloud.

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

my-user@example.com est l'adresse e-mail utilisée pour l'authentification avec gcloud (gcloud auth list --format='value(account)').

Bibliothèque d'authentifications Fleet Engine

Fleet Engine utilise des jetons JWT pour limiter l'accès aux API Fleet Engine. La nouvelle bibliothèque d'authentification Fleet Engine, disponible sur GitHub, simplifie la construction des jetons JWT Fleet Engine et les signe de manière sécurisée.

Elle offre les avantages suivants:

  • Simplifie le processus de création de jetons Fleet Engine.
  • Fournit des mécanismes de signature de jetons autres que l'utilisation de fichiers d'identifiants (par exemple, l'emprunt d'identité d'un compte de service).
  • Associe des jetons signés aux requêtes sortantes effectuées à partir d'un bouchon gRPC ou d'un client GAPIC.

Créer un jeton Web JSON (JWT) pour l'autorisation

Lorsque vous n'utilisez pas la bibliothèque d'authentification Fleet Engine, les jetons JWT doivent être créés directement dans votre codebase. Pour cela, vous devez bien comprendre les jetons JWT et leur lien avec Fleet Engine. C'est pourquoi nous vous recommandons vivement de tirer parti de la bibliothèque d'authentification Fleet Engine.

Dans Fleet Engine, les jetons JWT fournissent une authentification de courte durée et garantissent que les appareils ne peuvent modifier que les véhicules ou les tâches pour lesquels ils sont autorisés. Les jetons JWT contiennent un en-tête et une section de revendication. La section d'en-tête contient des informations telles que la clé privée à utiliser (obtenue auprès des comptes de service) et l'algorithme de chiffrement. La section de revendication contient des informations telles que l'heure de création du jeton, sa valeur TTL, les services auxquels le jeton demande l'accès et d'autres informations d'autorisation permettant de limiter l'accès (par exemple, l'ID du véhicule de livraison).

Une section d'en-tête JWT contient les champs suivants:

ChampDescription
alg Algorithme à utiliser. "RS256".
typ Type de jeton. "JWT".
enfant ID de la clé privée de votre compte de service. Vous trouverez cette valeur dans le champ "private_key_id" du fichier JSON de votre compte de service. Veillez à utiliser une clé provenant d'un compte de service disposant des autorisations appropriées.

Une section des revendications JWT contient les champs suivants:

ChampDescription
iss Adresse e-mail de votre compte de service.
sub Adresse e-mail de votre compte de service.
aud le nom de service (SERVICE_NAME) de votre compte de service (ici, https://fleetengine.googleapis.com/) ;
iat Horodatage de la création du jeton, spécifié en secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC. Prévoyez 10 minutes pour le décalage. Si l'horodatage est trop éloigné dans le passé ou futur, le serveur peut signaler une erreur.
exp Code temporel d'expiration du jeton, spécifié en secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC. La requête échoue si l'horodatage est postérieur à plus d'une heure.
autorisation Selon le cas d'utilisation, peut contenir "deliveryvehicleid", "trackingid", "taskid" ou "taskid".

La génération d'un jeton JWT correspond à sa signature. Pour obtenir des instructions et des exemples de code pour la création et la signature du jeton JWT, consultez la section Autorisation de compte de service sans OAuth. Vous pouvez ensuite associer un jeton signé aux appels gRPC ou à d'autres méthodes utilisées pour accéder à Fleet Engine.

Revendications JWT

Last Mile Fleet Solution utilise des revendications privées. L'utilisation de revendications privées garantit que seuls les clients autorisés peuvent accéder à leurs propres données. Par exemple, lorsque votre backend émet un jeton Web JSON pour l'appareil mobile d'un livreur, ce jeton doit contenir la revendication deliveryvehicleid avec la valeur de l'ID du véhicule de livraison de ce chauffeur. Ensuite, en fonction du rôle de conducteur, les jetons n'autorisent l'accès que pour l'ID de véhicule fourni et non pour tout autre ID de véhicule arbitraire.

Last Mile Fleet Solution utilise les revendications privées suivantes:

  • deliveryvehicleid : à utiliser lors de l'appel d'API par véhicule de livraison.
  • taskid : à utiliser lors de l'appel d'API par tâche.
  • taskids : à utiliser lorsque vous appelez BatchCreateTasksAPI. Cette revendication doit se présenter sous forme de tableau, et celui-ci doit contenir tous les ID de tâche nécessaires au traitement de la requête. N'incluez pas les revendications delivervehicleid, trackingid ou taskid.
  • trackingid : à utiliser lors de l'appel de SearchTasksAPI. La revendication doit correspondre à l'ID de suivi de la requête. N'incluez pas les revendications delivervehicleid, taskid ou taskids.

Le jeton doit également contenir la revendication appropriée lorsque vous appelez des API à partir de votre serveur backend, mais vous pouvez utiliser la valeur spéciale d'un astérisque ("*") pour les revendications deliveryvehicleid, taskid et trackingid. L'astérisque ("*") peut également être utilisé dans la revendication taskids, mais il doit s'agir du seul élément du tableau.

Si vous souhaitez créer et signer un fichier JSON directement en tant que support de jeton plutôt que d'utiliser des jetons d'accès OAuth 2.0, consultez les instructions concernant l'autorisation via un compte de service sans OAuth dans la documentation sur l'identité pour les développeurs.

Le mécanisme permettant d'associer le jeton à un appel gRPC dépend du langage et du framework utilisés pour effectuer l'appel. Le mécanisme permettant de spécifier un jeton dans un appel HTTP consiste à inclure un en-tête d'autorisation avec un jeton de support dont la valeur est le jeton, comme indiqué dans les notes d'autorisation pour les cas d'utilisation individuels du suivi des livraisons ou des performances du parc.

L'exemple suivant présente un jeton pour une opération par tâche à partir de votre serveur 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": "*"
       }
    }

L'exemple suivant présente un jeton pour une opération de création de tâches par lot à partir de votre serveur 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": {
         "taskids": ["*"]
       }
    }

L'exemple suivant montre un jeton pour une opération par véhicule de livraison à partir de votre serveur 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": {
         "deliveryvehicleid": "*"
       }
    }

L'exemple suivant présente un jeton pour les clients des utilisateurs finaux:

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

L'exemple suivant présente un jeton pour votre application de pilote:

    {
      "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"
       }
    }
  • Dans le champ kid de l'en-tête, spécifiez l'ID de clé privée de votre compte de service. Vous trouverez cette valeur dans le champ private_key_id du fichier JSON de votre compte de service.
  • Dans les champs iss et sub, indiquez l'adresse e-mail de votre compte de service. Vous trouverez cette valeur dans le champ client_email du fichier JSON de votre compte de service.
  • Dans le champ aud, spécifiez https://SERVICE_NAME/.
  • Pour le champ iat, spécifiez l'horodatage de la création du jeton, en secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC. Prévoyez 10 minutes pour le décalage. Si l'horodatage est trop ancien ou futur, le serveur peut signaler une erreur.
  • Pour le champ exp, spécifiez l'horodatage de l'expiration du jeton, en secondes depuis le 1er janvier 1970 à 00:00:00 UTC. La valeur recommandée est iat + 3 600.

Lorsque vous signez le jeton à transmettre à un appareil mobile ou à un utilisateur final, veillez à utiliser le fichier d'identifiants pour le rôle de livreur ou de client. Sinon, l'appareil mobile ou l'utilisateur final aura la possibilité de modifier ou d'afficher des informations auxquelles ils ne devraient pas avoir accès.