API OpenFlyers : Différence entre versions

Aller à : navigation, rechercher
(Utiliser l'API)
(41 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
=Présentation=
 
=Présentation=
L'objet de cette page est de décrire :
+
L'objet de cette page est de décrire l'API OpenFlyers.
*l'[[#Ancien-module-d'identification-checkIdent.php|ancien module de vérification d'un couple identifiant/mot de passe basé sur le script checkIdent.php]]
+
*Le [[#OAuth2|nouveau module d'identification]] basé sur le protocole OAuth2.
+
L'ancien module checkIdent.php est prévu être désactivé au 31/12/2021.
+
  
=Ancien module d'identification checkIdent.php=
+
'''Attention : l'ancien module checkIdent.php ne doit plus être utilisé. Il est prévu être désactivé au 01/03/2022'''.
Ce chapitre explique comment vérifier qu'un couple identifiant/mot de passe envoyé, par vos propres scripts, est conforme à la base de données d'OpenFlyers.
+
  
Le script retourne une valeur indiquant si la connexion, avec des identifiants données, a réussi et son état. Un cookie OpenFlyers est aussi retourné, permettant de gérer une session utilisateur sur votre site, en utilisant le compte utilisateur OpenFlyers de l'utilisateur connecté.
+
OpenFlyers possède une API basée sur [[Wikipedia-en:OAuth#OAuth_2.0|OAuth2]] qui permet à des serveurs extérieurs, dûment [[#Enregistrer-un-client|enregistrés]], de mettre en œuvre un processus d'[[Wikipedia-fr:Authentification_unique|authentification unique (SSO)]] et/ou de récupération des résultats des requêtes SQL de la [[Bibliothèque-des-rapports|bibliothèque des rapports]] ou des rapports personnalisés sous la forme de fichiers CSV.
  
;Comment ça marche
+
Un client de démonstration est disponible pour comprendre les mécanismes décrits ci-dessous.
Si votre plateforme OpenFlyers se situe sur le lien https://openflyers.com/nom-plateforme/, envoyez simplement une requête POST sur le lien https://openflyers.com/nom-plateforme/checkIdent.php avec comme paramètres les variables '''login''' et '''rawPassword'''.
+
  
'''Attention:''' Le mot de passe nécessite d'être chiffré en MD5 (cf. la ligne $postData dans le script PHP).
+
Son utilisation est décrite dans le chapitre [[#Client-de-démonstration|Client de démonstration]] de cette page.
  
;Valeurs de retour possibles
+
Le client de démonstration est lui-même accessible à cette adresse : https://openflyers.com/oauth2-demo/index.php
Le script retourne un chiffre parmi les suivant :
+
*0 : OK
+
*1 : OK mais plusieurs profils disponibles. OpenFlyers sélectionne automatiquement le meilleur profil.
+
*2 : Expiré mais autorisé
+
*3 : Expiré mais autorisé, avec un profil expiré
+
*4 : Abonnement expiré, refusé
+
*5 : Mauvais identifiants, refusé
+
*6 : IP ou identifiants bloqués, refusé
+
*7 : Aucun identifiant donné, ils sont demandés
+
*8 : Authentification réussie mais avec des contrats non signés, bloquant tant qu'il reste des contrats à signer. Pour signer les contrats se connecter sur la plateforme OpenFlyers avec le compte bloqué puis signer les contrats à la connexion.
+
*9 : L'abonnement à la plateforme est périmé, le couple identifiant/mot de passe n'est pas vérifié, accès refusé
+
  
Nous vous recommandons de considérer un code de retour entre 0 et 2 comme bon et mauvais entre 3 et 8.
+
Le code source du client de démonstration est mis à disposition par OpenFlyers à cette adresse : https://openflyers.com/oauth2-demo/oauth2-demo-src.zip
  
'''Attention:''' Vous devez filtrer les identifiants de connexion libres (sans droits) puisque pour OpenFlyers, ils correspondent à des accès autorisés !!!
+
Son utilisation est décrite dans le chapitre [[#Configurer-le-client-à-partir-du-code-source|Configurer le client à partir du code source]].
 
+
;JavaScript
+
Si vous utilisez votre propre formulaire d'authentification, utilisez la fonction javascript submit_pwd() située dans \javascript\submitPwd.js .
+
 
+
;Exemple de code PHP
+
Voici un exemple de code PHP permettant d'envoyer une requête POST :
+
<php>// PHP 5.6 is required
+
// OpenSSL 1.0.1 is required
+
function httpPostRequest($host, $path, $postData) {
+
    $result= "";
+
   
+
    $request = "POST $path HTTP/1.1\n".
+
    "Host: $host\n".
+
    (isset($referer) ? "Referer: $referer\n" : "").
+
    "Content-type: Application/x-www-form-urlencoded\n".
+
    "Content-length: ".strlen($postData)."\n".
+
    "Connection: close\n\n".
+
    $postData."\n";
+
   
+
    // Some debug informations:
+
    print("<pre>Request:\n".htmlentities($request)."</pre>");
+
   
+
    if ($fp = fsockopen($host, 443, $errno, $errstr, 3)) {
+
        // Set cryptology method
+
        // @link http://php.net/manual/en/function.stream-socket-enable-crypto.php
+
        if (!defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
+
            die('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT IS REQUIRED');
+
        }
+
        $cryptoMethod = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
+
        // Activate encryption while authenticating
+
        stream_socket_enable_crypto($fp, true, $cryptoMethod);
+
        if (fputs($fp, $request)) {
+
            while(! feof($fp)) {
+
                $result.= fgets($fp, 128);
+
            }
+
            // Deactivate encryption once authenticating done
+
            stream_socket_enable_crypto($fp, false);
+
            fclose($fp);
+
            //print($result);
+
            return $result;
+
        }
+
    }
+
}
+
 
+
$postData  = 'login=jbond&rawPassword='.md5('007');
+
$rawContent = httpPostRequest('openflyers.com','https://openflyers.com/plateform-name/checkIdent.php',$postData);
+
 
+
list($header, $content) = explode("\r\n\r\n", $rawContent, 2);
+
list($byteQty, $realContent, $dummy) = explode("\r\n", $content, 3);
+
 
+
// the answer is in $realContent</php>
+
 
+
=OAuth2=
+
OpenFlyers possède une API basée sur [[Wikipedia-en:OAuth#OAuth_2.0|OAuth2]] qui permet à des serveurs extérieurs de mettre en oeuvre un processus d'[[Wikipedia-fr:Authentification_unique|authentification unique (SSO)]] et/ou de récupération des résultats des requêtes SQL de la [[Bibliothèque-des-rapports|bibliothèque des rapports]] sous la forme de fichiers CSV.
+
  
 
OAuth2 propose plusieurs mécanismes pour permettre l'authentification. Un mécanisme d'authentification détermine la séquence exacte des étapes impliquées dans le processus d'authentification d'OAuth2. OpenFlyers met à disposition deux mécanismes d'authentification :
 
OAuth2 propose plusieurs mécanismes pour permettre l'authentification. Un mécanisme d'authentification détermine la séquence exacte des étapes impliquées dans le processus d'authentification d'OAuth2. OpenFlyers met à disposition deux mécanismes d'authentification :
Ligne 101 : Ligne 31 :
 
OAuth2 dispose de ''scopes''. Un scope est un privilège définit de manière explicite permettant l'accès à une ressource protégée. OpenFlyers met à disposition une [[#Liste des scopes disponibles|liste de scopes]] utilisables à travers l'API.
 
OAuth2 dispose de ''scopes''. Un scope est un privilège définit de manière explicite permettant l'accès à une ressource protégée. OpenFlyers met à disposition une [[#Liste des scopes disponibles|liste de scopes]] utilisables à travers l'API.
  
==Préparation==
+
Deux options ont été ajoutées à l'API OpenFlyers. La première correspond à [[#Authentification-TLS-Mutuelle-(mTLS)|mTLS]]. [[#Authentification-TLS-Mutuelle-(mTLS)|mTLS]] permet, en plus d'authentifier le serveur avec un certificat, d'authentifier le client avec un certificat TLS. Cette fonctionnalité permet d'éviter les usurpations d'identité. La seconde correspond à [[#HTTP-Signature|HTTP-Signature]]. [[#HTTP-Signature|HTTP-Signature]] permet de signer les en-têtes et le corps (lorsqu'il y en a un) des messages échangés afin d'en garantir leur intégrité.
===Enregistrer un client===
+
 
 +
=Préparation=
 +
==Enregistrer un client==
 
Pour utiliser l'API OAuth2, il faut enregistrer un client OAuth2 auprès d'OpenFlyers. Pour ceci, suivre les étapes suivantes :
 
Pour utiliser l'API OAuth2, il faut enregistrer un client OAuth2 auprès d'OpenFlyers. Pour ceci, suivre les étapes suivantes :
  
Ligne 121 : Ligne 53 :
 
*Dans l'onglet '''Généralités''', cocher la case relative à la colonne '''Connexion depuis l'extérieur (OAuth2)''' pour le profil souhaité.
 
*Dans l'onglet '''Généralités''', cocher la case relative à la colonne '''Connexion depuis l'extérieur (OAuth2)''' pour le profil souhaité.
  
Une fois les opérations précédentes exécutées,
+
[[Fichier:Oauth2 manage.png]]
*Créer un nouveau client OAuth2 à partir du menu '''Imports''' dans le panneau d'administration.
+
 
**Choisir un nom pour le client.
+
Une fois les opérations précédentes exécutées, créer un nouveau client OAuth2 à partir du menu '''Imports''' dans le panneau d'administration.
**Sélectionner le mécanisme d'autorisation utilisé par le client :
+
 
***Pour utiliser OAuth2 comme solution SSO ou accéder à des données utilisateurs, choisir ''Authorization Code''. Cette méthode peut être couplée avec le mécanisme de mémorisation de connexion (''Refresh Token'').
+
[[Fichier:Oauth2 client creation.png]]
***Pour utiliser OAuth2 dans un contexte d'automatisme, choisir ''Client Credentials''.
+
 
**Saisir l'URI de redirection vers le client pour le mécanisme ''Authorization Code''.
+
*Choisir un nom pour le client.
**Sélectionner l'utilisateur virtuel créé précédemment pour le mécanisme ''Client Credentials''.
+
*Sélectionner le mécanisme d'autorisation utilisé par le client :
**[[#Génération-des-certificats|Générer deux CSR]] afin d'obtenir deux certificats signés et les saisir :
+
**Pour utiliser OAuth2 comme solution SSO ou accéder à des données utilisateurs, choisir ''Authorization Code''. Cette méthode peut être couplée avec le mécanisme de mémorisation de connexion (''Refresh Token'').
***Le premier est utilisé pour l'authentification mutuelle avec mTLS.
+
**Pour utiliser OAuth2 dans un contexte d'automatisme, choisir ''Client Credentials''.
***Le second est utilisé pour la signature des en-têtes HTTP.
+
*Saisir l'URI de redirection vers le client pour le mécanisme ''Authorization Code''.
 +
*Sélectionner l'utilisateur virtuel créé précédemment pour le mécanisme ''Client Credentials''.
 +
*[[#Génération-des-certificats|Générer deux CSR]] afin d'obtenir deux certificats signés et les saisir :
 +
**Le premier est utilisé pour l'authentification mutuelle avec mTLS.
 +
**Le second est utilisé pour la signature des en-têtes HTTP.
 
;Un couple ID/passphrase est généré. La passphrase n'est communiquée qu'une seule fois. Elle doit être sauvegardée en lieu sûr et rester confidentielle.
 
;Un couple ID/passphrase est généré. La passphrase n'est communiquée qu'une seule fois. Elle doit être sauvegardée en lieu sûr et rester confidentielle.
 +
 +
[[Fichier:Oauth2 client created.png]]
  
 
'''À noter''' : les certificats du CA d'OpenFlyers et de signature HTTP du serveur sont nécessaires. Ils sont téléchargeables depuis l'interface de configuration des clients OAuth2.
 
'''À noter''' : les certificats du CA d'OpenFlyers et de signature HTTP du serveur sont nécessaires. Ils sont téléchargeables depuis l'interface de configuration des clients OAuth2.
Ligne 144 : Ligne 82 :
 
** Choisir l'emplacement de stockage (utilisateur ou ordinateur) et cliquer sur '''Suivant''' puis '''Suivant''' et enfin '''Terminer'''
 
** Choisir l'emplacement de stockage (utilisateur ou ordinateur) et cliquer sur '''Suivant''' puis '''Suivant''' et enfin '''Terminer'''
  
===Générer des certificats===
+
==Générer des certificats==
 
L'API OAuth2 implémente [https://tools.ietf.org/html/draft-cavage-http-signatures-10 HTTP Signature] et l'[[Wikipedia-en:Mutual_authentication#mTLS|authentification TLS mutuelle]]. Ces mécanismes utilisent chacun une paire certificat/clé privée différente.
 
L'API OAuth2 implémente [https://tools.ietf.org/html/draft-cavage-http-signatures-10 HTTP Signature] et l'[[Wikipedia-en:Mutual_authentication#mTLS|authentification TLS mutuelle]]. Ces mécanismes utilisent chacun une paire certificat/clé privée différente.
  
Ligne 200 : Ligne 138 :
  
 
Une fois ces CSR obtenus :
 
Une fois ces CSR obtenus :
*Les renseigner dans les champs prévus à cet effet lors de la [[#Enregistrement-du-client|création d'un client]] et télécharger les certificats signés depuis l'interface une fois le client créé.
+
*Les renseigner dans les champs prévus à cet effet lors de la [[#Enregistrer-un-client|création d'un client]] et télécharger les certificats signés depuis l'interface une fois le client créé.
 
*Garder la clé privée confidentielle. Une fuite poserait un risque de sécurité. Elle va de paire avec le certificat distribué par l'autorité de certification OpenFlyers.
 
*Garder la clé privée confidentielle. Une fuite poserait un risque de sécurité. Elle va de paire avec le certificat distribué par l'autorité de certification OpenFlyers.
  
==Authentification TLS Mutuelle (mTLS)==
+
=Authentification TLS Mutuelle (mTLS)=
  
 
En général dans une communication TLS, seul le serveur a l'obligation de fournir un certificat. Il est également possible pour le client de fournir un certificat. Ce principe s'appelle l'authentification mutuelle et est mise en place avec Mutual TLS (ou [[Wikipedia-en:Mutual_authentication#mTLS|mTLS]]).
 
En général dans une communication TLS, seul le serveur a l'obligation de fournir un certificat. Il est également possible pour le client de fournir un certificat. Ce principe s'appelle l'authentification mutuelle et est mise en place avec Mutual TLS (ou [[Wikipedia-en:Mutual_authentication#mTLS|mTLS]]).
Ligne 220 : Ligne 158 :
 
'''À noter''' : le certificat du CA d'OpenFlyers est nécessaire pour assurer la validité des certificats utilisés.
 
'''À noter''' : le certificat du CA d'OpenFlyers est nécessaire pour assurer la validité des certificats utilisés.
  
==HTTP Signature==
+
=HTTP Signature=
  
 
HTTP Signature utilise le principe de la signature numérique pour garantir l'authenticité et l'intégrité du message HTTP.
 
HTTP Signature utilise le principe de la signature numérique pour garantir l'authenticité et l'intégrité du message HTTP.
Ligne 230 : Ligne 168 :
 
*Digest : contient le corps du message haché.
 
*Digest : contient le corps du message haché.
  
===Digest===
+
==Digest==
 
Le ''digest'' est calculé comme ceci : <code>digest = base64encode(sha256(corps du message))</code>
 
Le ''digest'' est calculé comme ceci : <code>digest = base64encode(sha256(corps du message))</code>
  
Ligne 240 : Ligne 178 :
 
<php>$digestHeader = 'Digest: SHA-256=' . base64_encode(hash('sha256', $postData, true));</php>
 
<php>$digestHeader = 'Digest: SHA-256=' . base64_encode(hash('sha256', $postData, true));</php>
  
===Signature===
+
==Signature==
 
L'en-tête HTTP de signature est structuré de la manière suivante : <code>Signature: keyId="<keyId>",algorithm="<algo>",headers="<signed_headers>",signature="<signature>"</code>
 
L'en-tête HTTP de signature est structuré de la manière suivante : <code>Signature: keyId="<keyId>",algorithm="<algo>",headers="<signed_headers>",signature="<signature>"</code>
  
Ligne 289 : Ligne 227 :
 
'''À noter''' : les en-têtes sont à signer côté client avec le certificat de signature signé par le CA d'OpenFlyers et dédié au client ainsi que la clé privée associée. Le certificat de signature dédié au client est téléchargeable depuis l'interface de gestion des clients OAuth2. Les en-têtes de la réponse du serveur quant à elles doivent être vérifiées avec le certificat de signature HTTP du serveur, téléchargeable aussi depuis l'interface de configuration des clients OAuth2.
 
'''À noter''' : les en-têtes sont à signer côté client avec le certificat de signature signé par le CA d'OpenFlyers et dédié au client ainsi que la clé privée associée. Le certificat de signature dédié au client est téléchargeable depuis l'interface de gestion des clients OAuth2. Les en-têtes de la réponse du serveur quant à elles doivent être vérifiées avec le certificat de signature HTTP du serveur, téléchargeable aussi depuis l'interface de configuration des clients OAuth2.
  
==Client OAuth2==
+
=Client OAuth2=
 
Une fois le client OAuth2 configuré sur OpenFlyers, il faut l'utiliser avec un client créé au préalable pour communiquer avec le serveur d'autorisation et l'API.
 
Une fois le client OAuth2 configuré sur OpenFlyers, il faut l'utiliser avec un client créé au préalable pour communiquer avec le serveur d'autorisation et l'API.
  
 
Plusieurs [https://oauth.net/code/ bibliothèques] simplifiant la création d'un client sont disponibles.
 
Plusieurs [https://oauth.net/code/ bibliothèques] simplifiant la création d'un client sont disponibles.
  
Des scripts client basiques écrits en php sont aussi fournis pour les mécanismes [[Contrôle-d'identification-par-OpenFlyers-pour-un-logiciel-tiers#Script-client-:-authorization-code|''authorization_code'']] et [[Contrôle-d'identification-par-OpenFlyers-pour-un-logiciel-tiers#Script-client-:-client-credentials|''client_credentials'']]
+
Des scripts client basiques écrits en php sont aussi fournis pour les mécanismes [[#Script-client-:-authorization-code|''authorization_code'']] et [[#Script-client-:-client-credentials|''client_credentials'']]
  
===Authorization Code===
+
==Authorization Code==
 
Ce flux OAuth2 se déroule en plusieurs étapes :
 
Ce flux OAuth2 se déroule en plusieurs étapes :
 
*Le client redirige le navigateur de l'utilisateur vers l'URL d'autorisation.
 
*Le client redirige le navigateur de l'utilisateur vers l'URL d'autorisation.
Ligne 343 : Ligne 281 :
  
  
====Générer les codes pour PKCE====
+
===Générer les codes pour PKCE===
 
Pour faire fonctionner le client OAuth2, il faut générer deux codes pour l'extension PKCE :
 
Pour faire fonctionner le client OAuth2, il faut générer deux codes pour l'extension PKCE :
 
*Un ''code_verifier'' échangé pendant la demande de jeton d'accès.
 
*Un ''code_verifier'' échangé pendant la demande de jeton d'accès.
Ligne 373 : Ligne 311 :
  
  
====Demande d'autorisation====
+
===Demande d'autorisation===
Pour initier la demande d'autorisation, rediriger le navigateur de l'utilisateur vers l'URL : <code>GET https://openflyers.com/nom-de-plateforme/oauth/authorize.php</code>.
+
Pour initier la demande d'autorisation, rediriger le navigateur de l'utilisateur vers l'URL : <code>GET https://openflyers.com/nom-de-plateforme/oauth/authorize.php</code>. Remplacer <code>nom-de-plateforme</code> par le nom de la plateforme utilisée.
  
 
Envoyer également les paramètres suivants :
 
Envoyer également les paramètres suivants :
Ligne 395 : Ligne 333 :
 
|}
 
|}
  
====Demande de jeton d'accès====
+
===Demande de jeton d'accès===
 
Après avoir répondu à la demande, l'utilisateur est redirigé vers l'URI fourni pendant l'enregistrement du client. Si la demande est acceptée, un code temporaire : ''code'' est fourni, ainsi que le paramètre ''state'' fourni pendant la demande avec la même valeur. Si la demande est refusée, un code d'erreur est renvoyé.
 
Après avoir répondu à la demande, l'utilisateur est redirigé vers l'URI fourni pendant l'enregistrement du client. Si la demande est acceptée, un code temporaire : ''code'' est fourni, ainsi que le paramètre ''state'' fourni pendant la demande avec la même valeur. Si la demande est refusée, un code d'erreur est renvoyé.
 
;Si le paramètre ''state'' a une valeur différente de celle envoyée avec la demande, c'est peut-être une tentative d'attaque et il faut refuser la réponse.
 
;Si le paramètre ''state'' a une valeur différente de celle envoyée avec la demande, c'est peut-être une tentative d'attaque et il faut refuser la réponse.
  
Echanger ce ''code'' contre un jeton d'accès via l'URL : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>
+
Echanger ce ''code'' contre un jeton d'accès via l'URL : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>. Remplacer <code>nom-de-plateforme</code> par le nom de la plateforme utilisée.
  
 
Les paramètres suivants sont également nécessaires :
 
Les paramètres suivants sont également nécessaires :
Ligne 426 : Ligne 364 :
 
}</javascript>
 
}</javascript>
  
====Script client : Authorization Code====
+
===Script client : Authorization Code===
 
Voici un exemple simple de client OAuth2 pour le mécanisme d'authentification par code d'autorisation (Authorization Code).
 
Voici un exemple simple de client OAuth2 pour le mécanisme d'authentification par code d'autorisation (Authorization Code).
  
Ligne 940 : Ligne 878 :
 
;Ce script a été conçu pour montrer le fonctionnement du mécanisme afin de tester l'implémentation d'un serveur et n'a pas été testé extensivement. Il est conseillé d'utiliser une solution adaptée à un environnement de production.
 
;Ce script a été conçu pour montrer le fonctionnement du mécanisme afin de tester l'implémentation d'un serveur et n'a pas été testé extensivement. Il est conseillé d'utiliser une solution adaptée à un environnement de production.
  
===Client Credentials===
+
==Client Credentials==
 
Ce mécanisme d'autorisation est adapté pour l'automatisation. Il fonctionne de la manière suivante :
 
Ce mécanisme d'autorisation est adapté pour l'automatisation. Il fonctionne de la manière suivante :
 
*Le client effectue la demande de jeton d'accès au serveur d'autorisation en fournissant ses identifiants.
 
*Le client effectue la demande de jeton d'accès au serveur d'autorisation en fournissant ses identifiants.
Ligne 972 : Ligne 910 :
  
  
====Demande de jeton d'accès====
+
===Demande de jeton d'accès===
Pour obtenir un jeton d'accès, il faut effectuer la requête suivante : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>
+
Pour obtenir un jeton d'accès, il faut effectuer la requête suivante : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>. Remplacer <code>nom-de-plateforme</code> par le nom de la plateforme utilisée.
  
 
Les paramètres suivants sont nécessaires :
 
Les paramètres suivants sont nécessaires :
Ligne 997 : Ligne 935 :
 
}</javascript>
 
}</javascript>
  
====Script client : Client Credentials====
+
===Script client : Client Credentials===
 
Voici un exemple simple d'un client OAuth2 pour le mécanisme d'authentification par les identifiants client (Client Credentials).
 
Voici un exemple simple d'un client OAuth2 pour le mécanisme d'authentification par les identifiants client (Client Credentials).
  
Ligne 1 005 : Ligne 943 :
 
   "client_secret": "",
 
   "client_secret": "",
 
   "token_uri": "https://openflyers.com/nom-de-plateforme/oauth/access_token.php",
 
   "token_uri": "https://openflyers.com/nom-de-plateforme/oauth/access_token.php",
   "resource_uri": "https://openflyers.com/nom-de-plateforme/oauth/resource.php",
+
   "resource_uri": "https://openflyers.com/nom-de-plateforme/oauth/resources.php",
 
   "auth_cert": "/path/to/client/auth_cert.crt",
 
   "auth_cert": "/path/to/client/auth_cert.crt",
 
   "auth_key": "/path/to/client/auth.key",
 
   "auth_key": "/path/to/client/auth.key",
Ligne 1 411 : Ligne 1 349 :
 
;Ce script a été conçu pour montrer le fonctionnement du mécanisme et tester l'implémentation d'un serveur, il n'a pas été testé extensivement. Il est conseillé d'utiliser une solution adaptée à un environnement de production.
 
;Ce script a été conçu pour montrer le fonctionnement du mécanisme et tester l'implémentation d'un serveur, il n'a pas été testé extensivement. Il est conseillé d'utiliser une solution adaptée à un environnement de production.
  
===Refresh Token===
+
==Refresh Token==
 
Refresh Token (ou jeton de rafraîchissement en français) est un mécanisme d'autorisation particulier. Il ne peut fonctionner en tant que tel, il fonctionne de pair avec [[#Authorization-Code|Authorization Code]]. Lorsqu'un jeton d'accès arrive est arrivé en fin de vie, si le client y est autorisé, il peut faire une demande de renouvellement de son jeton d'accès auprès du serveur d'autorisation en présentant son jeton de rafraîchissement. Le serveur d'autorisation vérifie la validité et génère un autre jeton d'accès qu'il transmet au client, sans que l'utilisateur final n'aît à se connecter de nouveau.
 
Refresh Token (ou jeton de rafraîchissement en français) est un mécanisme d'autorisation particulier. Il ne peut fonctionner en tant que tel, il fonctionne de pair avec [[#Authorization-Code|Authorization Code]]. Lorsqu'un jeton d'accès arrive est arrivé en fin de vie, si le client y est autorisé, il peut faire une demande de renouvellement de son jeton d'accès auprès du serveur d'autorisation en présentant son jeton de rafraîchissement. Le serveur d'autorisation vérifie la validité et génère un autre jeton d'accès qu'il transmet au client, sans que l'utilisateur final n'aît à se connecter de nouveau.
  
Ligne 1 442 : Ligne 1 380 :
 
       |                                  |                              |
 
       |                                  |                              |
  
====Demande de renouvellement d'un jeton====
+
===Demande de renouvellement d'un jeton===
Pour obtenir un renouvellement de jeton d'accès, il faut effectuer la requête suivante : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>
+
Pour obtenir un renouvellement de jeton d'accès, il faut effectuer la requête suivante : <code>POST https://openflyers.com/nom-de-plateforme/oauth/access_token.php</code>. Remplacer <code>nom-de-plateforme</code> par le nom de la plateforme utilisée.
  
 
Les paramètres suivants sont nécessaires :
 
Les paramètres suivants sont nécessaires :
Ligne 1 466 : Ligne 1 404 :
 
}</javascript>
 
}</javascript>
  
===Liste des scopes disponibles===
+
==Liste des scopes disponibles==
 
Un scope sur OAuth2 correspond à un droit d'accès sur une ressource particulière. Chaque scope est unique et indique de manière explicite le privilège qu'il donne. Il n'y a aucune restriction d'utilisation des scopes par rapport aux mécanismes. Chaque scope peut être utilisé avec n'importe quel mécanisme. Il n'y a que des recommandations vis à vis de leur utilisation. OpenFlyers définit une liste de scopes dédiée aux ressources accessibles par les clients. Ces scopes sont les suivants :
 
Un scope sur OAuth2 correspond à un droit d'accès sur une ressource particulière. Chaque scope est unique et indique de manière explicite le privilège qu'il donne. Il n'y a aucune restriction d'utilisation des scopes par rapport aux mécanismes. Chaque scope peut être utilisé avec n'importe quel mécanisme. Il n'y a que des recommandations vis à vis de leur utilisation. OpenFlyers définit une liste de scopes dédiée aux ressources accessibles par les clients. Ces scopes sont les suivants :
 
{| class="wikitable"
 
{| class="wikitable"
Ligne 1 475 : Ligne 1 413 :
 
|genericreports.readonly||Accéder aux rapports génériques autorisés pour le client en lecture seule. Ce scope est recommandé pour '''Client Credentials'''.
 
|genericreports.readonly||Accéder aux rapports génériques autorisés pour le client en lecture seule. Ce scope est recommandé pour '''Client Credentials'''.
 
|-
 
|-
|reports.readonly||Accéder aux rapports personnalisés autorisés pour le client en lecture seule (pas encore implémenté). Ce scope est recommandé pour '''Client Credentials'''.
+
|reports.readonly||Accéder aux rapports personnalisés autorisés pour le client en lecture seule. Ce scope est recommandé pour '''Client Credentials'''.
 
|}
 
|}
  
===Utiliser l'API===
+
==Utiliser l'API==
Une fois un jeton d'accès obtenu, les données sont accessibles par une requête POST exécutée vers l'URL : <code>https://openflyers.com/nom-de-plateforme/oauth/resources.php</code>. La requête POST doit respecter une structure particulière. Cette structure diffère en fonction du type de ressource souhaité et chaque ressource ne peut être accédée qu'[[#Liste-des-scopes-disponibles|avec le scope qui lui est associé]]. Le jeton d'accès doit être renseigné dans l'en-tête HTTP ''Authorization'' en y indiquant la valeur complète du jeton d'accès reçu précédé du type de jeton reçu  : <code>Authorization: <token_type> <access_token></code>.
+
Une fois un jeton d'accès obtenu, les données sont accessibles par une requête POST exécutée vers l'URL : <code>https://openflyers.com/nom-de-plateforme/oauth/resources.php</code>. Remplacer <code>nom-de-plateforme</code> par le nom de la plateforme utilisée. La requête POST doit respecter une structure particulière. Cette structure diffère en fonction du type de ressource souhaité et chaque ressource ne peut être accédée qu'[[#Liste-des-scopes-disponibles|avec le scope qui lui est associé]]. Le jeton d'accès doit être renseigné dans l'en-tête HTTP ''Authorization'' en y indiquant la valeur complète du jeton d'accès reçu précédé du type de jeton reçu  : <code>Authorization: <token_type> <access_token></code>.
  
====Récupérer les informations de l'utilisateur connecté====
+
===Récupérer les informations de l'utilisateur connecté===
 
Ce type de ressource est nommé '''user_information'''. Cette ressource n'est accessible qu'avec le scope '''default.login'''. Cette ressource permet la récupération des informations de l'utilisateur connecté, en d'autre termes, l'utilisateur connecté lors de l'étape d'autorisation et correspondant à celui ayant émis la demande de jeton d'accès. À l'heure actuelle, seul l'identifiant de l'utilisateur connecté est retourné. La requête POST est construite de la manière suivante :
 
Ce type de ressource est nommé '''user_information'''. Cette ressource n'est accessible qu'avec le scope '''default.login'''. Cette ressource permet la récupération des informations de l'utilisateur connecté, en d'autre termes, l'utilisateur connecté lors de l'étape d'autorisation et correspondant à celui ayant émis la demande de jeton d'accès. À l'heure actuelle, seul l'identifiant de l'utilisateur connecté est retourné. La requête POST est construite de la manière suivante :
  
Ligne 1 513 : Ligne 1 451 :
 
La réponse est retournée dans un conteneur JSON.
 
La réponse est retournée dans un conteneur JSON.
  
====Récupérer les rapports génériques====
+
===Récupérer les rapports génériques===
 
Ce type de ressource est nommé '''generic_report'''. Cette ressource n'est accessible qu'avec le scope '''genericreports.readonly'''. Cette ressource permet la récupération des rapports génériques au format CSV autorisés pour le profil de l'utilisateur associé au client OAuth2 enregistré. La requête POST est construite de la manière suivante :
 
Ce type de ressource est nommé '''generic_report'''. Cette ressource n'est accessible qu'avec le scope '''genericreports.readonly'''. Cette ressource permet la récupération des rapports génériques au format CSV autorisés pour le profil de l'utilisateur associé au client OAuth2 enregistré. La requête POST est construite de la manière suivante :
  
Ligne 1 553 : Ligne 1 491 :
 
La réponse est un fichier CSV retourné dans un conteneur JSON.
 
La réponse est un fichier CSV retourné dans un conteneur JSON.
  
====Récupérer les rapports personnalisés====
+
===Récupérer les rapports personnalisés===
 
Ce type de ressource est nommé '''report'''. Cette ressource n'est accessible qu'avec le scope '''reports.readonly'''. Cette ressource permet la récupération des rapports personnalisés au format CSV autorisés pour le profil de l'utilisateur associé au client OAuth2 enregistré. La requête POST est construite de la manière suivante :
 
Ce type de ressource est nommé '''report'''. Cette ressource n'est accessible qu'avec le scope '''reports.readonly'''. Cette ressource permet la récupération des rapports personnalisés au format CSV autorisés pour le profil de l'utilisateur associé au client OAuth2 enregistré. La requête POST est construite de la manière suivante :
  
Ligne 1 593 : Ligne 1 531 :
 
La réponse est un fichier CSV retourné dans un conteneur JSON.
 
La réponse est un fichier CSV retourné dans un conteneur JSON.
  
=Plugin d'authentification Joomla=
+
=Client de démonstration=
Si vous avez un site Joomla et que vous désirer de permettre aux utilisateurs OpenFlyers de se connecter à votre espace restreint Joomla, vous devriez ajouter ce plugin de manière à avoir une unique base de données de comptes utilisateurs : celle d'OpenFlyers.
+
Un client de démonstration est disponible pour le logiciel OpenFlyers à cette adresse : https://openflyers.com/oauth2-demo/index.php
 +
 
 +
==Utiliser le client==
 +
Le client de démonstration se présente de la manière suivante.
 +
 
 +
[[Fichier:Oauth2-client-demo.png]]
 +
 
 +
La démonstration est composée de deux colonnes. La première, nommée '''Authorization Code''' correspond [[#Authorization Code|au mécanisme d'autorisation du même nom]]. Elle dispose d'un bouton permettant de se connecter ainsi que d'une section indiquant les informations relatives à l'état de la connexion. La seconde colonne, nommée '''Client Credentials''' correspond elle aussi [[#Client Credentials|au mécanisme d'autorisation du même nom]]. Comme pour la première colonne, les éléments qui y sont présentés sont identiques. La différence étant que le bouton de connexion n'a pas le même effet étant donné que ces deux mécanismes sont différents. Chaque mécanisme est indépendant et il est possible de se connecter à un des deux mécanismes sans se connecter à l'autre ou se connecter aux deux en même temps.
 +
 
 +
Pour le mécanisme '''Authorization Code''', le bouton de connexion redirige le navigateur vers la page de connexion du logiciel OpenFlyers. Renseigner les identifiants de l'administrateur pour s'y connecter.
 +
* Nom d'utilisateur : '''admini'''.
 +
* Mot de passe : '''azerty'''.
 +
 
 +
Une fois les informations saisies, la page suivante est affichée.
 +
 
 +
[[Fichier:Oauth authorize demo.png]]
 +
 
 +
Cliquer sur le bouton '''Autoriser l'application''' pour autoriser la connexion. Une fois le bouton cliqué, le navigateur est redirigé vers la p