Meilleures pratiques pour sécuriser une API / un service Web REST [fermé]


828

Lors de la conception d'une API ou d'un service REST, existe-t-il des meilleures pratiques établies pour gérer la sécurité (authentification, autorisation, gestion des identités)?

Lorsque vous créez une API SOAP, vous avez WS-Security comme guide et de nombreuses publications existent sur le sujet. J'ai trouvé moins d'informations sur la sécurisation des points de terminaison REST.

Bien que je comprenne que REST n'a intentionnellement pas de spécifications analogues à WS- *, j'espère que les meilleures pratiques ou les modèles recommandés ont émergé.

Toute discussion ou tout lien vers des documents pertinents serait très apprécié. Si cela est important, nous utiliserions WCF avec des messages sérialisés POX / JSON pour nos API / services REST construits à l'aide de la v3.5 du .NET Framework.


1
connaissez-vous une application réelle complète utilisant de bons modèles et de bonnes pratiques avec l'API REST et les services Web dans github?
PreguntonCojoneroCabrón

Réponses:


298

Comme l'a dit tweakt, Amazon S3 est un bon modèle avec lequel travailler. Leurs signatures de demande ont certaines fonctionnalités (telles que l'incorporation d'un horodatage) qui aident à se prémunir contre la relecture des demandes accidentelles et malveillantes.

La bonne chose à propos de HTTP Basic est que pratiquement toutes les bibliothèques HTTP le prennent en charge. Vous devrez, bien sûr, exiger SSL dans ce cas, car l'envoi de mots de passe en clair sur le net est presque universellement une mauvaise chose. De base est préférable à Digest lors de l'utilisation de SSL car même si l'appelant sait déjà que les informations d'identification sont requises, Digest nécessite un aller-retour supplémentaire pour échanger la valeur nonce. Avec Basic, les appelants envoient simplement les informations d'identification la première fois.

Une fois que l'identité du client est établie, l'autorisation n'est plus qu'un problème de mise en œuvre. Cependant, vous pouvez déléguer l'autorisation à un autre composant avec un modèle d'autorisation existant. Encore une fois, la bonne chose à propos de Basic ici est que votre serveur se retrouve avec une copie en clair du mot de passe du client que vous pouvez simplement transmettre à un autre composant de votre infrastructure si nécessaire.


3
SSL est un élément important de la sécurité, mais toutes les applications ne nécessitent pas ce niveau de cryptage. Si quelqu'un vole en transit ce que vous allez publier publiquement sur Twitter, est-ce un inconvénient si important? Pour la majorité du cryptage SSL de l'API va être préféré. Les exigences d'infrastructure de SSL sont un peu plus élevées qu'avec le texte en clair et aucun serveur de mise en cache intermédiaire (lire ici sur la base) ne peut participer à la mise en cache du contenu accédé à plusieurs reprises. Attention, votre évolutivité peut en souffrir si vous avez absolument besoin du chiffrement proposé.
Norman H

36
@NormanH: Votre argument est spécieux, car si quelqu'un peut voir l'intégralité de la transaction que j'utilise pour publier sur Twitter, il pourrait donc me faire passer pour moi et publier ses propres messages sous mon nom.
Greg Hewgill

3
Citant wikipedia sur l'authentification Digest, «l'authentification d'accès Digest est l'une des méthodes convenues qu'un serveur Web peut utiliser pour négocier les informations d'identification avec le navigateur Web d'un utilisateur. Il applique une fonction de hachage à un mot de passe avant de l'envoyer sur le réseau, qui est plus sûr que l'authentification d'accès de base, qui envoie du texte en clair. " ce serait une façon standard d'accomplir ce à quoi j'ai fait allusion ci-dessus. (Voir en.wikipedia.org/wiki/Digest_access_authentication pour les détails)
Norman H

5
"sending plaintext passwords over the net is almost universally a bad thing"- Pouvez-vous élaborer sur le "presque"? Quand n'est-ce pas une mauvaise idée?
toniedzwiedz

2
@GregHewgill même dans un réseau privé, je ne voudrais pas que mes utilisateurs puissent intercepter les mots de passe les uns des autres. La seule situation à laquelle je peux penser, dans laquelle il est OK d'envoyer un mot de passe sur un réseau, c'est lorsque l'utilisateur est seul sur le réseau. Le fait que de telles choses se produisent ailleurs n'est guère une raison pour le permettre.
toniedzwiedz

115

Il n'y a pas de normes pour REST autres que HTTP. Il existe des services REST bien établis. Je vous suggère de jeter un œil à eux et de vous faire une idée de leur fonctionnement.

Par exemple, nous avons emprunté beaucoup d'idées au service S3 REST d'Amazon lors du développement du nôtre. Mais nous avons choisi de ne pas utiliser le modèle de sécurité plus avancé basé sur les signatures de demande. L'approche la plus simple est l'authentification HTTP de base sur SSL. Vous devez décider ce qui fonctionne le mieux dans votre situation.

Aussi, je recommande fortement le livre RESTful Web Services d'O'reilly. Il explique les concepts de base et fournit quelques meilleures pratiques. Vous pouvez généralement prendre le modèle fourni et le mapper à votre propre application.


6
RESTful Web Services est certainement un excellent livre. A lire absolument dans ce domaine. C'était carrément inspirant.
EdgarVerona

6
Comment se fait-il que @aehlke ait reçu autant de votes positifs pour ce commentaire étant donné (1) qu'il n'y a rien de tel qu'une spécification REST et (2) la dissertation de Fielding sur les styles architecturaux et la conception d'architectures logicielles en réseau mentionne explicitement REST et HTTP en 6.3: REST appliqué à HTTP.

20
HTTP n'est pas une exigence pour REST.
nategood

1
Le livre RESTful Web Services est disponible gratuitement sur leur site Web: crummy.com/writing/RESTful-Web-Services
icc97

J'avais l'intention de lire le livre et j'ai réalisé qu'il était principalement ciblé pour le format XML. Dois-je utiliser ce livre compte tenu de la popularité de JSON? Ou il ne dépend pas du format d'échange de données. Besoin de conseils.
Bhargav Jhaveri

72

Vous pouvez également jeter un œil à OAuth , un nouveau protocole ouvert pour l'autorisation basée sur des jetons ciblant spécifiquement les API http.

Il est très similaire à l'approche adoptée par flickr et rappelez-vous les apis de lait "repos" (pas nécessairement de bons exemples d'apis reposants, mais de bons exemples de l'approche basée sur les jetons).


3
Mais il semble que l'oAuth à 2 pattes, qui est selon moi ce dont nous avons besoin ici, ne soit pas couvert (manque d'informations) autant que celui à 3 pattes.
redben

4
OAuth concerne la délégation d'autorisation, c'est-à-dire que je suis le propriétaire du service d'informations / compte A interagir avec mes données sur le service B (par exemple, je laisse Twitter écrire sur mon facebook). Ce n'est pas une autorisation au sens large qui consiste à contrôler ce que les utilisateurs peuvent faire sur les ressources (données, informations, services ...). C'est là que XACML intervient. XACML vous permet de définir des stratégies d'autorisation sur qui peut faire quoi.
David Brossard

60

Il y a une grande liste de contrôle trouvée sur Github :

Authentification

  • Ne réinventez pas la roue dans l'authentification, la génération de jetons et le stockage des mots de passe. Utilisez les normes.

  • Utiliser Max Retryet emprisonner les fonctionnalités de la connexion.

  • Utilisez le cryptage sur toutes les données sensibles.

JWT (jeton Web JSON)

  • Utilisez une clé aléatoire compliquée (JWT Secret) pour rendre le forçage brutal très difficile.

  • N'extrayez pas l'algorithme de la charge utile. Forcer l'algorithme dans le backend (HS256 ou RS256).

  • Faites en sorte que l'expiration des jetons ( TTL, RTTL) soit aussi courte que possible.

  • Ne stockez pas de données sensibles dans la JWTcharge utile, elles peuvent être décodées facilement.

OAuth

  • Validez toujours redirect_uricôté serveur pour n'autoriser que les URL en liste blanche.

  • Essayez toujours d'échanger du code et non des jetons (ne pas autoriser response_type=token).

  • Utilisez le paramètre d'état avec un hachage aléatoire pour empêcher CSRFle OAuthprocessus d'authentification.

  • Définissez la portée par défaut et validez les paramètres de portée pour chaque application.

Accès

  • Limitez les demandes (limitation) pour éviter les attaques DDoS / force brute.

  • Utilisez HTTPS côté serveur pour éviter le MITM (Man In The Middle Attack)

  • Utilisez l'en- HSTStête avec SSL pour éviter une attaque SSL Strip.

Contribution

  • Utilisez la méthode HTTP appropriée en fonction de l'opération: GET(lecture), POST(création), PUT/PATCH(remplacement / mise à jour) et DELETE(pour supprimer un enregistrement), et répondez 405 Method Not Allowedsi la méthode demandée n'est pas appropriée pour la ressource demandée.

  • Valider type de contenu sur demande en- Accepttête (négociation de contenu) pour permettre uniquement le format pris en charge (par exemple application/xml, application/jsonetc.) et d'y répondre avec une 406 Not Acceptableréponse si ne correspond pas.

  • Valider content-typedes données affichées que vous acceptez (par exemple application/x-www-form-urlencoded, multipart/form-data, application/json, etc.).

  • Validez les entrées utilisateur pour éviter les vulnérabilités courantes (par exemple XSS, injection SQL, exécution de code à distance, etc.).

  • N'utilisez pas de données sensibles (informations d'identification, mots de passe, jetons de sécurité ou clés API) dans l'URL, mais utilisez l'en- Authorizationtête standard .

  • Utilisez un service API Gateway pour activer la mise en cache, les Rate Limitpolitiques (par exemple, Quota, Spike Arrest, Concurrent Rate Limit) et déployer dynamiquement les ressources des API.

En traitement

  • Vérifiez si tous les points de terminaison sont protégés derrière l'authentification pour éviter un processus d'authentification interrompu.

  • L'ID de ressource propre à l'utilisateur doit être évité. Utilisez / moi / commandes au lieu de / utilisateur / 654321 / commandes.

  • Ne pas incrémenter automatiquement les ID. Utilisez plutôt l'UUID.

  • Si vous analysez des fichiers XML, assurez-vous que l'analyse d'entité n'est pas activée pour éviter XXE (attaque d'entité externe XML).

  • Si vous analysez des fichiers XML, assurez-vous que l'expansion d'entité n'est pas activée pour éviter la bombe de Billion Laughs / XML via une attaque d'expansion exponentielle d'entité.

  • Utilisez un CDN pour les téléchargements de fichiers.

  • Si vous avez affaire à une énorme quantité de données, utilisez Workers et Queues pour traiter autant que possible en arrière-plan et renvoyer rapidement la réponse pour éviter le blocage HTTP.

  • N'oubliez pas de désactiver le mode DEBUG .

Production

  • Envoyer l'en- X-Content-Type-Options: nosnifftête.

  • Envoyer l'en- X-Frame-Options: denytête.

  • Envoyer l'en- Content-Security-Policy: default-src 'none'tête.

  • Retirer les en- têtes d' empreintes digitales - X-Powered-By, Server, X-AspNet-Versionetc.

  • Forcer content-typepour votre réponse, si vous revenez, application/jsonle type de contenu de votre réponse est application/json.

  • Ne renvoyez pas de données sensibles comme les informations d'identification, les mots de passe, les jetons de sécurité.

  • Renvoyez le code d'état approprié en fonction de l'opération terminée. (par exemple 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, etc.).


1
Belle liste, quoique un peu opiniâtre - et elle commence par un imho absurde: "Ne pas utiliser l'authentification de base Utiliser l'authentification standard (par exemple JWT, OAuth)." Vous ne pouvez pas obtenir plus standard que l'authentification de base, et il a sa place, en particulier pour les API où les clients ne sont pas des navigateurs (pour les navigateurs, JWT est généralement plus approprié). OAuth d'autre part utilise un tout autre ensemble de compromis pour l'authentification et n'est pas vraiment comparable à Basic Auth et JWT.
johndodo

Vous avez raison, BasicAuth avec HTTPS est courant, mais il est vivement débattu - security.stackexchange.com/questions/988/… . Je supprimerai tout de même ce point.
Andrejs

43

Je suis un peu surpris que SSL avec les certificats clients n'ait pas encore été mentionné. Certes, cette approche n'est vraiment utile que si vous pouvez compter sur la communauté des utilisateurs identifiés par des certificats. Mais un certain nombre de gouvernements / entreprises les remettent à leurs utilisateurs. L'utilisateur n'a pas à se soucier de créer une autre combinaison nom d'utilisateur / mot de passe, et l'identité est établie sur chaque connexion afin que la communication avec le serveur puisse être entièrement sans état, aucune session utilisateur n'est requise. (Pour ne pas impliquer que toutes / toutes les autres solutions mentionnées nécessitent des sessions)


Nous l'utilisons en fait pour certaines intégrations ainsi que pour les tunnels VPN cryptés pour prendre en charge les systèmes plus anciens que nous ne contrôlons pas et qui ne peuvent pas communiquer via https.
Casey

Les certificats clients peuvent poser problème lorsque vous avez besoin d'un équilibrage de charge ... cela peut être fait, mais c'est moins simple.
Jeremy Logan

2
@fiXedd - Le contraire a été mon expérience avec les certificats clients car ils sont vraiment apatrides. Les connexions authentifiées par client cert peuvent être équilibrées en charge avec un équilibreur de charge stupide sans tenir compte de l'adhérence de la connexion car elles ne nécessitent aucun état partagé entre le client et le serveur.
stinkymatt

4
Oh, vous pouvez le faire ... vous pouvez simplement demander à l'équilibreur de charge de transmettre le trafic TCP, mais vous ne pouvez pas, par exemple, avoir l'équilibreur de charge comme point de terminaison pour SSL.
Jeremy Logan

Est-il toujours sécurisé si les certificats clients et son autorité racine sont auto-signés? L'autorité racine sera importée dans les autorités de certification racine de confiance du client.
Joyce

38

Tout le monde dans ces réponses a ignoré le véritable contrôle d'accès / autorisation.

Si, par exemple, vos API / services Web REST concernent le POST / OBTENIR des dossiers médicaux, vous pouvez définir une politique de contrôle d'accès sur qui peut accéder aux données et dans quelles circonstances. Par exemple:

  • les médecins peuvent obtenir le dossier médical d'un patient avec lequel ils entretiennent une relation de soins
  • personne ne peut publier des données médicales en dehors des heures de pratique (par exemple 9 à 5)
  • les utilisateurs finaux peuvent obtenir les dossiers médicaux qu'ils possèdent ou les dossiers médicaux des patients dont ils sont le tuteur
  • les infirmières peuvent METTRE À JOUR le dossier médical d'un patient qui appartient à la même unité que l'infirmière.

Afin de définir et de mettre en œuvre ces autorisations à granularité fine, vous devrez utiliser un langage de contrôle d'accès basé sur des attributs appelé XACML, le langage de balisage de contrôle d'accès eXtensible.

Les autres normes ici concernent les suivantes:

  • OAuth: id. fédération et délégation d'autorisation, par exemple laisser un service agir en mon nom sur un autre service (Facebook peut publier sur mon Twitter)
  • SAML: fédération d'identité / SSO web. SAML dépend beaucoup de qui est l'utilisateur.
  • Normes WS-Security / WS- *: elles se concentrent sur la communication entre les services SOAP. Ils sont spécifiques au format de messagerie au niveau de l'application (SOAP) et ils traitent des aspects de la messagerie, par exemple la fiabilité, la sécurité, la confidentialité, l'intégrité, l'atomicité, les événements ... Aucun ne couvre le contrôle d'accès et tous sont spécifiques à SOAP.

XACML est indépendant de la technologie. Il peut être appliqué aux applications java, aux services Web .NET, Python, Ruby ..., aux API REST, etc.

Voici des ressources intéressantes:


2
Je ne comprends pas pourquoi vous ne pouvez pas simplement implémenter un système de jetons qui obtiendra l'utilisateur et ses autorisations qui seront essentiellement la même chose?
Stan

Vous pouvez adopter une approche basée sur des jetons. Cela fonctionne bien aussi, mais vous avez toujours besoin de la logique qui définit les autorisations que les utilisateurs obtiennent, en d'autres termes, les autorisations à insérer dans le jeton. C'est ce que XACML peut vous aider à réaliser. Il évite également les ballonnements symboliques.
David Brossard

2
En guise de commentaire secondaire, qu'est-ce que le «9 à 5» contribue à la sécurité? Comme si les attaquants n'étaient actifs que la nuit? Sans parler des graves implications d'usage, comme si les médecins ne travaillaient que "9 à 5".
Roland

C'est une exigence courante dans les scénarios de soins de santé. Découvrez HL7 par exemple. Il existe également des scénarios de casse au cas où un médecin aurait besoin d'accéder en dehors des heures d'ouverture. Quant aux pirates, une fois qu'ils sont dans tous les paris sont désactivés
David Brossard

1
Certains de mes collègues enquêtent effectivement là-dessus. Merci @SimplyG.
David Brossard,

25

J'ai utilisé OAuth à quelques reprises et j'ai également utilisé d'autres méthodes (BASIC / DIGEST). Je suggère de tout cœur OAuth. Le lien suivant est le meilleur didacticiel que j'ai vu sur l'utilisation d'OAuth:

http://hueniverse.com/oauth/guide/


Bien qu'il s'agisse d'une très vieille réponse concernant OAuth 1.0, il convient de noter que l'auteur du lien que vous citez avait ceci à dire à propos d'OAuth 2.0 : "J'ai conclu qu'OAuth 2.0 est un mauvais protocole ... Par rapport à OAuth 1.0, la spécification 2.0 est plus complexe, moins interopérable, moins utile, plus incomplète et, surtout, moins sûre. " . Pour être clair, le commentaire que je cite a été fait plusieurs années après que vous ayez posté votre réponse.
skomisa

17

L'un des meilleurs messages que j'ai jamais rencontrés concernant la sécurité en ce qui concerne REST est terminé chez 1 RainDrop . Les API MySpace utilisent OAuth également pour la sécurité et vous avez un accès complet à leurs canaux personnalisés dans le code RestChess, avec lequel j'ai fait beaucoup d'exploration. C'était une démonstration chez Mix et vous pouvez trouver la publication ici .


Merci pour le lien (1 RainDrop) - discussion très intéressante sur la sécurité en ce qui concerne SOAP v REST
Nathan

15

Merci pour les excellents conseils. Nous avons fini par utiliser un en-tête HTTP personnalisé pour transmettre un jeton d'identité du client au service, en préparation de l'intégration de notre API RESTful avec le futur framework Zermatt Identity de Microsoft. J'ai décrit le problème ici et notre solution ici . J'ai également suivi les conseils de tweakt et acheté des services Web RESTful - un très bon livre si vous créez une API RESTful de quelque sorte que ce soit.


1
Cette approche me semble louche. Qu'est-ce qui empêche un attaquant d'utiliser le jeton d'identité pour masquer le client? HTTPS ne protège pas l'URL ou les en-têtes la dernière fois que j'ai vérifié ...
Gili

2
Hmmm ... je ne suis pas sûr d'avoir raison. Je crois qu'à l'exception des quelques en-têtes nécessaires pour comprendre quel type de cryptage est requis, tous les autres en-têtes sont cryptés.
Nathan

51
C'est faux. HTTPS protège TOUT. Ça va: TCP handshake ... TLS handshake ... <ENCRYPTED> GET / foo 200 OK ... démontage </ENCRYPTED>.
Mark Renouf

1
Notez que vous pouvez également passer un jeton sous forme de cookie (au lieu d'un en-tête personnalisé). Cela se comporte bien dans les navigateurs car il utilise un en-tête HTTP avec des comportements standard dans la plupart des boîtes à outils et applications. Côté service, le cookie n'a pas à se rapporter à une session, vous pouvez l'utiliser pour communiquer le token que vous souhaitez.
Bruce Alderson

11
La Wayback Machine est une belle chose: description et solution du problème
cjc343


7

Je recommanderais OAuth 2/3. Vous pouvez trouver plus d'informations sur http://oauth.net/2/


8
Attention à expliquer pourquoi recommanderiez-vous la version 2 alors qu'elle reste largement incomplète? À mon humble avis, la version 1.0a reste une solution solide pour la plupart des applications.
Butifarra

6

J'ai beaucoup cherché sur la sécurité ws reposante et nous avons également fini par utiliser un jeton via un cookie du client au serveur pour authentifier les demandes. J'ai utilisé la sécurité Spring pour l'autorisation des demandes en service parce que je devais authentifier et autoriser chaque demande en fonction des politiques de sécurité spécifiées qui étaient déjà dans DB.


6

Le fait que le monde SOAP soit assez bien couvert par des normes de sécurité ne signifie pas qu'il est sécurisé par défaut. En premier lieu, les normes sont très complexes. La complexité n'est pas un très bon ami des vulnérabilités de sécurité et d'implémentation telles que les attaques par habillage de signature XML sont endémiques ici.

En ce qui concerne l'environnement .NET, je n'aiderai pas beaucoup, mais «Construire des services Web avec Java» (une brique avec ~ 10 auteurs) m'a beaucoup aidé à comprendre l'architecture de sécurité WS- * et, en particulier, ses bizarreries.


4

REST lui-même n'offre aucune norme de sécurité, mais des choses comme OAuth et SAML deviennent rapidement les normes dans cet espace. Cependant, l'authentification et l'autorisation ne sont qu'une petite partie de ce que vous devez considérer. De nombreuses vulnérabilités connues liées aux applications Web s'appliquent beaucoup aux API REST. Vous devez prendre en compte la validation des entrées, le craquage de session, les messages d'erreur inappropriés, les vulnérabilités internes des employés, etc. C'est un gros sujet.


4

Je veux ajouter (conformément à stinkeymatt), la solution la plus simple serait d'ajouter des certificats SSL à votre site. En d'autres termes, assurez-vous que votre URL est HTTPS: //. Cela couvrira votre sécurité de transport (coup pour le dollar). Avec les URL RESTful, l'idée est de rester simple (contrairement à WS * security / SAML), vous pouvez utiliser oAuth2 / openID connect ou même Basic Auth (dans les cas simples). Mais vous aurez toujours besoin de SSL / HTTPS. Veuillez vérifier la sécurité de l'API Web ASP.NET 2 ici: http://www.asp.net/web-api/overview/security (Articles et vidéos)


3

Comme @Nathan s'est retrouvé avec ce qui est un simple en-tête HTTP, et certains avaient dit OAuth2 et des certificats SSL côté client. L'essentiel est le suivant ... votre API REST ne devrait pas avoir à gérer la sécurité car cela devrait vraiment être en dehors de la portée de l'API.

Au lieu de cela, une couche de sécurité doit être placée dessus, qu'il s'agisse d'un en-tête HTTP derrière un proxy Web (une approche courante comme SiteMinder, Zermatt ou même Apache HTTPd), ou aussi compliqué que OAuth 2.

L'essentiel est que les demandes doivent fonctionner sans aucune interaction avec l'utilisateur final. Il suffit de s'assurer que la connexion à l'API REST est authentifiée. En Java EE, nous avons la notion d'un userPrincipalqui peut être obtenu sur unHttpServletRequest . Il est également géré dans le descripteur de déploiement qu'un modèle d'URL peut être sécurisé de sorte que le code API REST n'a plus besoin d'être vérifié.

Dans le monde WCF, j'utiliserais ServiceSecurityContext.Currentpour obtenir le contexte de sécurité actuel. Vous devez configurer votre application pour exiger une authentification.

Il y a une exception à la déclaration que j'ai eu ci-dessus et c'est l'utilisation d'un nonce pour empêcher les rediffusions (qui peuvent être des attaques ou quelqu'un qui soumet simplement les mêmes données deux fois). Cette partie ne peut être gérée que dans la couche application.


3

Pour la sécurité des applications Web, vous devriez jeter un oeil à OWASP ( https://www.owasp.org/index.php/Main_Page ) qui fournit des fiches techniques pour diverses attaques de sécurité. Vous pouvez intégrer autant de mesures que possible pour sécuriser votre application. En ce qui concerne la sécurité des API (autorisation, authentification, gestion des identités), il existe plusieurs façons comme déjà mentionné (Basic, Digest et OAuth). Il y a des trous de boucle dans OAuth1.0, vous pouvez donc utiliser OAuth1.0a (OAuth2.0 n'est pas largement adopté en raison de problèmes avec la spécification)


2

Cela fait un moment mais la question est toujours d'actualité, même si la réponse a peut-être un peu changé.

Une passerelle API serait une solution flexible et hautement configurable. J'ai testé et utilisé un peu de KONG et j'ai vraiment aimé ce que j'ai vu. KONG fournit sa propre API REST d'administration que vous pouvez utiliser pour gérer les utilisateurs.

Express-gateway.io est plus récent et est également une passerelle API.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.