Gestion des tokens

Base de connaissances

Gestion des tokens


Icons/System/eye-open Created with Sketch. 11357 vues 10.12.2024 Tutoriels

Objectif

Découvrez comment configurer les connexions aux API keystone sur votre service à l'aide des tokens.

Les informations détaillées ici sont valables pour la version 3.0 de l'API de Keystone.

En pratique

Définitions

  • Endpoint : adresse HTTP pointant directement sur une API d'un service. par exemple https://auth.cloud.ovh.net/v3/ pour le endpoint d'authentification ou https://image.compute.gra1.cloud.ovh.net/ pour le endpoint de gestion des images de la zone GRA1.
  • Token : chaîne de caractère unique liée à une authentification et à des droits d'accès. Un token est demandé par l'utilisateur en fournissant ses credentials (informations d'identification) à l'API d'authentification. Le token est généré et fourni avec une durée de validité limitée de 24h. Un token peut être scoped ou unscoped, c'est à dire qu'il peut être directement lié à un tenant ou n'être lié à aucun tenant.

Principe global

La plupart des requêtes soumises aux APIs OpenStack doivent répondre à un mécanisme d'autorisation. Ce mécanisme fonctionne par l'obtention d'un token (jeton en français) et la validation de celui ci. Voici les grandes lignes du fonctionnement d'un appel depuis l'authentification jusqu'à l'exécution de l'appel.

  • Demande de création de token auprès du endpoint d'authentification avec les credentials.
  • Requête sur le endpoint du service désiré (storage, compute, network, ...) en fournissant le token en paramètre.
  • L'API du service récupère le token et demande la vérification de validité auprès du service d'authentification.
  • Si la validité est vérifiée, l'appel est pris en compte et exécuté.

Comme les tokens ont une durée de validité définie, ils expirent et doivent être renouvelés chaque fois que nécessaire.

De la même manière, si un token doit être révoqué avant sa date d'expiration, il est possible de le faire via l'API.

Pour plus d'information, consultez la documentation d'OpenStack de l'API.

Operations manuelles

Les opérations qui suivent peuvent être effectuées manuellement, elles sont généralement utilisées à des fins pédagogiques ou de dépannage.

Il est nécessaire de charger l'environnement à l'aide du fichier openRC. Pour cela, nous vous recommandons de télécharger et utiliser le fichier openrc.sh que vous trouverez dans l'interface Horizon. Ce dernier disposera de l’ensemble des variables d’environnement nécessaires â la construction des commandes qui vont suivre.

Pour vous connecter à Horizon et télécharger le fichier, consultez ce guide.

Dans notre exemple, nous souhaitons obtenir les informations de metadata d'un objet stocké grâce à l'offre Public Cloud Storage. Les étapes sont :

  • Demande de création d'un token.
  • Récupération des variables token ID et endpoint publicURL.
  • Requête sur l'objet avec les informations récupérées.

L'outil en ligne de commande cURL permet de construire des requêtes de toutes pièces.

Étape 1 : demande de creation d'un token

curl -X POST ${OS_AUTH_URL}v${OS_IDENTITY_API_VERSION}/auth/tokens -H "Content-Type: application/json" -d ' { "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "'$OS_USERNAME'", "domain": { "id": "default" }, "password": "'$OS_PASSWORD'" } } }, "scope": { "project": { "name": "'$OS_TENANT_NAME'", "domain": { "id": "default" } } } } }' | python -mjson.tool

La réponse du serveur ressemble à ceci :

 {
  "token": {
    "is_domain": false,
    "methods": [
      "password"
    ],
    "roles": [
      {
        "id": "9543e89aeb484aee8ec7d01e87223b16",
        "name": "objectstore_operator"
      }
    ],
    "is_admin_project": false,
    "project": {
      "domain": {
        "id": "default",
        "name": "Default"
      },
      "id": "<ID OF THE PROJECT>",
      "name": "<NAME OF THE PROJECT>"
    },
    "catalog": [
      {
        "endpoints": [
          {
            "url": "https://network.compute.sbg1.cloud.ovh.net/",
            "interface": "internal",
            "region": "SBG1",
            "region_id": "SBG1",
            "id": "075839111e7a41f1bb458926e5f04cec"
          },
          [...]
        ],
        "type": "network",
        "id": "0be6ed3dce244b8295ff643739a86809",
        "name": "neutron"
      },
      [...]
    ],
    "expires_at": "2020-01-17T14:53:32.000000Z",
    "user": {
      "password_expires_at": null,
      "domain": {
        "id": "default",
        "name": "Default"
      },
      "id": "<ID OF THE USER>",
      "name": "<NAME OF THE USER>"
    },
    "audit_ids": [
      "IuNOR-lKQ9GJGQd8taWBnQ"
    ],
    "issued_at": "2020-01-16T14:53:32.000000Z"
  }
}

Étape 2 : récupération des variables token ID et endpoint publicURL

Les deux informations sont disponibles dans la sortie de la commande précédente.

Pour le endpoint publicURL, il faut rechercher dans la section object-store et la région qui convient, ici SBG.

export endpoint="https://storage.sbg.cloud.ovh.net/v1/AUTH_9ea...ff0"

C'est l'adresse du endpoint du service d'object storage qui va permettre de requêter les informations sur l'objet.

export token=$(curl -is -X POST ${OS_AUTH_URL}v${OS_IDENTITY_API_VERSION}/auth/tokens -H "Content-Type: application/json" -d ' { "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "'$OS_USERNAME'", "domain": { "id": "default" }, "password": "'$OS_PASSWORD'" } } }, "scope": { "project": { "name": "'$OS_TENANT_NAME'", "domain": { "id": "default" } } } } }' | grep -i '^x-subject-token' | cut -d" " -f2)

Ce token est maintenant l'élément d'authentification qui sera utilisé pour la requête suivante.

Étape 3 : requête sur l'objet avec les informations récupérées

curl -X GET $endpoint/photos/fullsize/ovh-summit-2014-backstage-DS.jpg -H "X-Auth-Token: $token" -I
  • -X GET : méthode HTTP GET
  • $endpoint/photos/fullsize/ovh-summit-2014-backstage-DS.jpg : adresse de l'objet
  • -H "X-Auth-Token: $token" : élément d'authentification
  • -I : option curl pour ne récupérer que les metadatas

La réponse ressemble à ceci :

HTTP/1.1 200 OK
Content-Length: 190046
Content-Type: image/jpeg
Accept-Ranges: bytes
Last-Modified: Thu, 24 Sep 2015 14:20:11 GMT
Etag: c93e12530b66f121d4bd5a6ae096ee77
X-Timestamp: 1443104410.15437
X-Object-Meta-Mtime: 1424095540.000000
X-Trans-Id: 95CAB26E:D200_052711B1:01BB_560D4CE7_1631931:2BB4
Date: Thu, 01 Oct 2015 15:10:31 GMT
Connection: close

Gestion automatique : librairie et SDK

Il est fortement recommandé d'utiliser les librairies permettant la gestion transparente des tokens. De cette manière, en fournissant simplement les credentials de connexion à la librairie, les tokens seront automatiquement générés, utilisés et renouvelés sans devoir en faire la gestion au niveau applicatif.

Il existe de nombreuses librairies dans les différents langages. Consultez la liste officielle pour plus d'informations.

Suppression du token

curl -i -X DELETE \
  -H "X-Auth-Token: $OS_TOKEN" \
  -H "X-Subject-Token: $OS_TOKEN" \
  "http://localhost:5000/v3/auth/tokens"

S'il n'y a pas d'erreur, on obtient une réponse vide.

Aller plus loin

Échangez avec notre communauté d'utilisateurs.

Articles associés