| Prochaine révision | Révision précédente |
| informatique:api-rest:postgrest [2025/01/06 14:43] – créée - modification externe 127.0.0.1 | informatique:api-rest:postgrest [2025/10/13 12:25] (Version actuelle) – [Les droits] bertrand |
|---|
| docker run --name tutorial -p 5433:5432 \ | docker run --name tutorial -p 5433:5432 \ |
| -e POSTGRES_PASSWORD=mysecretpassword \ | -e POSTGRES_PASSWORD=mysecretpassword \ |
| -d postgres:13-alpine | -d postgres:17-alpine |
| </code> | </code> |
| |
| Cela va faire tourner une instance docker et exposer le port 5433 sur l'hôte depuis lequel on pourra accéder au serveur PostgreSQL. | Cela va faire tourner une instance docker et exposer le port 5433 sur l'hôte depuis lequel on pourra accéder au serveur PostgreSQL. |
| |
| <note tip>Si vous avez des données géographiques, il faut PostGIS… remplacer en fin de ligne de commande ci-dessus //postgres// par //postgis/postgis:12-3.0-alpine// ou //postgis/postgis:13-3.1-alpine//, cf. [[https://hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated|page postgis sur dockerhub]]\\ | <note tip>Si vous avez des données géographiques, il faut PostGIS… remplacer en fin de ligne de commande ci-dessus //postgres// par //postgis/postgis:13-3.5-alpine// ou //postgis/postgis:17-3.5-alpine// les version 14, 15, 16 existent aussi, cf. [[https://hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated|page postgis sur dockerhub]]\\ |
| On peut préférer aussi l'image //postgres:13-alpine// au lieu de la //postgres//, cette dernière est basée sur debian | On peut préférer aussi l'image //postgres:17-alpine// au lieu de la //postgres//, cette dernière est basée sur debian |
| </note> | </note> |
| <note important>Si vous coupez/redémarrez votre PC, il faudra redémarrer le conteneur : <code bash>docker container start tutorial</code></note> | <note important>Si vous coupez/redémarrez votre PC, il faudra redémarrer le conteneur : <code bash>docker container start tutorial</code></note> |
| </code> | </code> |
| |
| <note tip>Pour tester les requêtes on peut utiliser [[https://curl.se|curl]], et éventuellement faire un pipe sur //json query// (jq) pour que soit bien plus lisible le JSON retourné.\\ Il y a aussi l'utilitaire [[https://insomnia.rest/download|Insomnia]], et également Postman qui pousse plutôt la solution web, mais propose également un [[https://learning.postman.com/docs/getting-started/installation-and-updates/#installing-postman-on-linux|client lourd]], malheureusement, ni l'un ni l'autre ne sont libres ou Open Source !</note> | <note tip>Pour tester les requêtes on peut utiliser [[https://curl.se|curl]], et éventuellement faire un pipe sur //json query// (jq) pour que soit bien plus lisible le JSON retourné.\\ Il y a aussi l'utilitaire [[https://www.usebruno.com/|bruno]], [[https://insomnia.rest/download|Insomnia]], et également Postman qui pousse plutôt la solution web, mais propose également un [[https://learning.postman.com/docs/getting-started/installation-and-updates/#installing-postman-on-linux|client lourd]], la [[https://github.com/usebruno/bruno|version gratuite de Bruno]] est Open Source !</note> |
| ===== Utilisateur autorisé en écriture ===== | ===== Utilisateur autorisé en écriture ===== |
| |
| <note tip>Si on crée le serveur postgREST via un conteneur Docker, au lieu de ce fichier, on précise ce mot de passe via la clé //PGRST_JWT_SECRET// dans le docker-compose.yaml</note> | <note tip>Si on crée le serveur postgREST via un conteneur Docker, au lieu de ce fichier, on précise ce mot de passe via la clé //PGRST_JWT_SECRET// dans le docker-compose.yaml</note> |
| ==== Création du jeton JSON Web Token (JWT) ==== | ==== Création du jeton JSON Web Token (JWT) ==== |
| Plus d'informations sur les [[wpfr>JWT]]\\ | Plus d'informations sur les [[wpfr>JSON_Web_Token]]\\ |
| Rendez-vous sur [[https://jwt.io/#debugger-io|jwt.io]] puis suivez-les instructions comme sur le schéma:\\ | Le tutoriel de [[https://grafikart.fr/tutoriels/json-web-token-presentation-958|grafikart]]\\ |
| {{https://postgrest.org/en/v7.0.0/_images/tut1-jwt-io.png}} | Tutoriel avec une petit code JS/Node pour créer un JWT : https://www.geeksforgeeks.org/json-web-token-jwt/\\ |
| | ou via un script sh : https://postgrest.org/en/stable/tutorials/tut1.html#step-3-sign-a-token |
| |
| À quelques adaptations près : | À quelques adaptations près : |
| [[:informatique:api-rest:postgrest-dockeriser|dockeriser postgresql/postgis/postgrest]] | [[:informatique:api-rest:postgrest-dockeriser|dockeriser postgresql/postgis/postgrest]] |
| |
| | ===== Questions de sécurité ===== |
| | ==== Exposition des tables ==== |
| | Par défaut, PostgREST va exposer les tables de la base de données, divulguant ainsi le schéma de la base. |
| | Pour éviter cela, on peut créer des vues qui vont réaliser les jointures permettant de retourner une vue (//à plat//) et masquer d'éventuels attributs/champs de table qu'on ne souhaite pas divulguer. |
| | |
| | ==== Les droits ==== |
| | Il est évidemment important de bien définir les droits… FIXME à préciser |
| | À minima, il faut bien définir un u |
| | On a vu plus haut l'utilisation d'un rôle anonyme qui n'a que des droits en lecture, puis un rôle //user// qui a des droits en écriture, associé à un jeton (Token) JWT si besoin. |
| | |
| | ==== Injection SQL ==== |
| | Le parser de postgREST utilise des requêtes préparées (//invulnerable to SQL injection//) :\\ |
| | https://docs.postgrest.org/en/stable/references/configuration.html#db-prepared-statements |
| ===== Pour aller plus loin, jointures… ===== | ===== Pour aller plus loin, jointures… ===== |
| [[:informatique:api-rest:postgrest-jointure-postgis|Jointure et insertion de lieux avec coordonnées géographique (geometry)]] | * [[:informatique:api-rest:postgrest-jointure-postgis|Jointure et insertion de lieux avec coordonnées géographique (geometry)]] |
| | * [[https://postgis.net/documentation/tips/tip-move-postgis-schema/]] pbm //type "geometry" does not exist// lié à l’extention postgis/schéma //public//. |
| |