This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
portail-citoyen/help/fr/api-services.page

311 lines
9.0 KiB
Plaintext
Raw Normal View History

<page xmlns="http://projectmallard.org/1.0/"
type="guide" id="api-services" xml:lang="fr">
<info>
<link type="guide" xref="index#api" />
<revision docversion="0.1" date="2013-04-05" status="draft"/>
<revision docversion="0.3" date="2013-05-01" status="draft"/>
<credit type="author">
<name>Frédéric Péters</name>
<email>fpeters@entrouvert.com</email>
</credit>
<credit type="author">
<name>Benjamin Dauvergne</name>
<email>bdauvergne@entrouvert.com</email>
</credit>
<credit type="author">
<name>Pierre Cros</name>
<email>pcros@entrouvert.com</email>
</credit>
<desc>Remontée d'informations de services vers le portail citoyen</desc>
</info>
2013-04-21 18:30:25 +02:00
<title>Remontée d'informations vers le portail citoyen</title>
<section id="intro">
<title>Introduction</title>
<p>Le portail citoyen est une plate-forme dans laquelle sont agrégées des
informations provenant de sources web diverses.</p>
<p>Afin de permettre cette remontée d'information pour les services ne
disposant pas nativement d'une API exposée sur le Web, nous proposons
d'utiliser celle qui est décrite dans ce document.</p>
</section> <!-- #intro -->
<section id="structure">
<title>Structure de l'information fournie par les services</title>
<p>En réponse à la requête du portail citoyen, le service doit fournir une
information structurée. Cette réponse peut prendre plusieurs formes.</p>
<section id="fils">
<title>Fils d'info</title>
<p>Le portail peut intégrer, sans que cela ne nécessite la moindre
modification, les fils d'information au format <link
href="http://en.wikipedia.org/wiki/RSS">RSS</link> et <link
href="http://en.wikipedia.org/wiki/Atom_(standard)">Atom</link> qui sont
offerts par les services.</p>
</section> <!-- #fils -->
<section id="html">
<title>HTML</title>
<p>Comme pour les fils d'infos, des blocs de code HTML fournis par les services
peuvent être intégrés directement dans le portail. À noter toutefois que ce
HTML doit être "brut" parce qu'il est filtré. Il ne peut pas contenir de
Javascript par exemple.</p>
</section> <!-- #html -->
<section id="json">
<title>JSON</title>
<p>La réponse du service à la requête du portail peut aussi être faite en
JSON.</p>
<section id="liste">
<title>Liste</title>
<p>Les données exposées au format JSON doivent être organisées sous forme d'un
tableau associatif. Les clés (variables) de ce tableau sont les suivantes :</p>
<list>
<item><p><code>title</code> : titre (obligatoire)</p></item>
<item><p><code>url</code> : URL (obligatoire)</p></item>
<item><p><code>description</code> : description (facultatif)</p></item>
</list>
<p>La liste des données doit être attachées à une clé nommée <code>data</code>.
</p>
<p>Exemple :</p>
<code mime="application/json">
{ "data": [
{"title": "Demande de bac pour ordures",
"url": "https://eservices.example.com/dechets/demande-bac"},
{"title": "Demande d'acte de naissance",
"url": "https://eservices.example.com/actes/naissance",
"Description": "Faites vos démarches sans vous déplacer"}
]
}
</code>
</section> <!-- #liste -->
<section id="tableau">
<title>Tableau</title>
<p>Le portail citoyen peut aussi recevoir des données qu'il affichera sous
2013-05-01 16:34:22 +02:00
forme de tableau.</p>
<p>La liste des données doit être attachées à une clé nommée <code>data</code>
et une clé nommée <code>columns</code> peut exister pour fournir les libellés
des colonnes.
</p>
<p>Exemple : </p>
<code mime="application/json">
{"data": [
{"day": "Lundi", "open": "8h", "close": "17h"},
{"day": "Mardi", "open": "8h", "close": "19h"},
{"day": "Mercredi", "open": "9h", "close": "17h"}
],
"columns": {
"day": "Jour",
"open": "Horaire d'ouverture",
"close": "Horaire de fermeture"}
}
</code>
<p>Le résultat sur le portail citoyen sera l'affichage du tableau suivant :</p>
<table frame="none" rules="none" shade="rows">
<thead>
<tr>
<td><p>Jour</p></td>
<td><p>Horaire d'ouverture</p></td>
<td><p>Horaire de fermeture</p></td>
</tr>
</thead>
<tbody>
<tr>
<td><p>Lundi</p></td><td><p>8h</p></td><td><p>17h</p></td>
</tr>
<tr>
<td><p>Mardi</p></td><td><p>8h</p></td><td><p>19h</p></td>
</tr>
<tr>
<td><p>Mercredi</p></td><td><p>9h</p></td><td><p>17h</p></td>
</tr>
</tbody>
</table>
</section> <!-- #tableau -->
</section> <!-- #json -->
</section> <!-- #structure -->
<section id="requete">
<title>Requête</title>
<p>Le portail effectue des requêtes HTTP GET vers les différents services. Les
échanges atendus sont conformes au style d'architecture REST.</p>
<section id="req-security">
<title>Protection des accès au service</title>
<p>L'accès au service peut être protégé de différentes manières, le portail
citoyen peut utiliser les mécanismes suivants pour s'authentifier auprès du
service.</p>
<section id="req-security-http-auth">
<title>Authentification HTTP</title>
<p>Le portail citoyen peut utiliser l'authentification HTTP basique (définie
dans la RFC 2617).</p>
</section>
<section id="req-security-client-cert">
<title>Authentification par certificat X.509</title>
<p>Le portail citoyen peut s'authentifier à l'aide d'un certificat client.</p>
</section>
<!--
<section id="req-security-oauth2">
</section>
-->
<section id="req-security-shared-secret">
<title>Authentification par secret partagé</title>
<p>
L'URL peut être signée via une clé partagée à configurer des deux cotés de la
liaison, la signature est du type HMAC; l'algorithme de hash à employer est
passé en paramètre.
</p>
<note><p>Si le service doit être utilisé par différents requêteurs il est
recommandé de ne pas utiliser une clé unique; il est ainsi suggéré que l'URL
attende également un paramètre précisant l'appelant, à travers, par exemple,
un paramètre supplémentaire <code>apikey</code>.
</p></note>
<note><p>En ce qui concerne l'algorithme de hash, il est préconisé d'utiliser
SHA-256 par respect du <link
href="http://references.modernisation.gouv.fr/rgs-securite">Référentiel Général
de Sécurité (RGS)</link>.</p></note>
<p>
La signature est à calculer sur la query string encodée complète, en
enlevant les paramètres terminaux <code>algo</code>, <code>timestamp</code>,
<code>nonce</code> et <code>signature</code>. La formule de calcul de la
signature est la suivante :
</p>
<code>
BASE64(HMAC-HASH(query_string+'algo=HASH&amp;timestamp=' + timestamp + '&amp;nonce=" + nonce, clé))
</code>
<list>
<item><p><code>timestamp</code> est la date dans la zone GMT au format ISO8601
en se limitant à la précision des secondes (ex : 2012-04-04T12:34:00Z),
</p></item>
<item><p>nonce est une chaîne aléatoire contenant au moins 128 bits d'entropie
(16 octets aléatoires),</p></item>
<item><p>algo est une chaîne représentant l'algorithme de hachage utilisé, sont
définis : sha1, sha256, sha512 pour les trois algorithmes correspondant.
L'utilisation d'une valeur différente n'est pas définie.</p></item>
</list>
<p>
La query string définitive est ainsi :
</p>
<code>
<var>qs_initial</var>&amp;algo=<var>algo</var>&amp;timestamp=<var>ts</var>&amp;nonce=<var>nonce</var>&amp;signature=<var>signature</var>
</code>
<p>
Pour la validation il faut contrôler :
</p>
<list>
<item><p>que la signature regénérée est identique,</p></item>
<item><p>que le timestamp est dans une fenêtre étroite par rapport à la date
courante, il est recommandé d'accepter un écart de trente secondes
2013-04-21 18:40:12 +02:00
maximum.</p></item>
<item><p>que le nonce n'a encore jamais été vu (associé au timestamp il suffit
de conserver les nonces pour une durée de 3 ou 4 fois la fenêtre de temps, par
exemple cinq minutes).</p></item>
</list>
<note><p>
Lors de l'utilisation de ces signatures il est important d'utiliser HTTPS pour
2013-10-31 10:08:07 +01:00
éviter les interceptions et de stocker les nonces pour éviter les rejeux et à
maintenir une bonne synchronisation des horloges, en utilisant par exemple le
protocole NTP.
</p></note>
</section> <!-- req-security-shared-secret -->
</section> <!-- req-security -->
<section id="req-ident">
<title>Identification de l'usager</title>
<p>L'URI utilisée pour ces requêtes peut contenir des informations identifiant
l'usager concerné.</p>
<section id="saml">
<title>Identifiant SAML</title>
<p>Lorsque le service intègre le protocole de fédération d'identité SAML, la
requête identifiante utilisera un identifiant SAML, le NameID :</p>
<code>
https://www.example.com/eservices/pending?NameID=<var>nameid</var>
</code>
</section> <!-- #saml -->
<section id="adel">
<title>Adresse électronique</title>
<p>Lorsque le service n'intègre pas le protocole de fédération d'identité SAML,
la requête identifiante utilisera l'adresse électronique de l'utilisateur :</p>
<code>
https://www.example.com/eservices/pending?email=<var>email</var>
</code>
<note>
<title>Adresses électroniques identiques</title>
<p>L'utilisation de cette méthode pour identifier l'utilisateur ne fonctionne
que si ce dernier a employé la même adresse électronique pour la création du
compte citoyen et la création du compte sur le service.</p>
</note>
</section> <!-- #adel -->
</section> <!-- #req-ident -->
</section> <!-- #requete -->
</page>