Developpez.com - Rubrique PostgreSQL

Le Club des Développeurs et IT Pro

PostgREST, mettre en place une API RestFull depuis n'importe quelle base de données PostgreSQL,

Un tutoriel de Gérard Ernaelsten

Le 2019-12-17 11:04:40, par MaitrePylos, Modérateur
Bonjour,

Je vous présente un nouvel article expliquant comment mettre en place facilement une API REST au départ de n'importe quelle base de données PostgreSQL avec l'outil PostgREST:

PostgREST, mettre en place une API RestFull depuis n'importe quelle base de données PostgreSQL

En vous souhaitant une bonne lecture.

Retrouvez les meilleurs cours et tutoriels pour apprendre le SGBD PostgreSQL
  Discussion forum
7 commentaires
  • MaitrePylos
    Modérateur
    Bonjour,
    Pour autant que le rôle définit dans la base de données permet d'activer une procédure stockée, alors celui-ci pourras exécuter.
    C'est le même principe que le login que je décris dans l'article.
    Votre procédure/fonction sera alors placée dans une route rpc
  • Anselme45
    Membre extrêmement actif
    L'article démontre comment l'API PostgREST permet de faire de la requête SQL sur une base de données postgresql à partir d'applications mobiles.

    Qu'en est-il au sujet des procédures stockées?

    Si l'architecture de la base de données comprend non seulement des tables mais également des procédures stockées, est-ce que l'on peut activer ces procédures stockées via l'API PostgREST ou doit-on les remplacer par une approche "requête SQL"?

    Merci encore à l'auteur du tuto.
  • Anselme45
    Membre extrêmement actif
    Merci pour l'info...
  • IchCodes
    Candidat au Club
    Bonjour,

    Merci pour ce tutoriel, il m'as pas mal facilité.

    Cependant je me demande si cela est normal que login soit mentionné avec brain:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER FUNCTION brain.login(text, text)
        OWNER TO postgres;
    
    GRANT EXECUTE ON FUNCTION brain.login(text, text) TO postgres;
    
    GRANT EXECUTE ON FUNCTION brain.login(text, text) TO PUBLIC;
    
    GRANT EXECUTE ON FUNCTION brain.login(text, text) TO anonymous;
    Si on suit le tutoriel on a creer la fonction dans le schema public:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CREATE OR REPLACE FUNCTION public.login(
        pseudo text,
        pass text)
        RETURNS basic_auth.jwt_token
        LANGUAGE 'plpgsql'
    
        COST 100
        VOLATILE SECURITY DEFINER 
    AS $BODY$
    declare
      _role name;
      result basic_auth.jwt_token;
    begin
      -- check email and password
      select basic_auth.user_role(pseudo, pass) into _role;
      if _role is null then
        raise invalid_password using message = 'invalid user or password';
      end if;
    
      select sign(
          row_to_json(r), current_setting('public.jwt_secret')
        ) as token
        from (
          select _role as role, login.pseudo as pseudo,
             extract(epoch from now())::integer + 60*60 as exp
        ) r
        into result;
      return result;
    end;
    $BODY$;
    On devrait donc plutôt avoir ceci non ? :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER FUNCTION public.login(text, text)
        OWNER TO postgres;
    
    GRANT EXECUTE ON FUNCTION public.login(text, text) TO postgres;
    
    GRANT EXECUTE ON FUNCTION public.login(text, text) TO PUBLIC;
    
    GRANT EXECUTE ON FUNCTION public.login(text, text) TO anonymous;
    Je suis pas fort en sql je voulais donc être sûr, car cela génère une erreur de mon côté.

    Merci d'avance pour ton aide !
  • MaitrePylos
    Modérateur
    Oups bien vu.
    J'ai mélangé le tuto fais pour le boulot avec celui-ci.
    Tu as raison, la fonction est bien dans public.
  • IchCodes
    Candidat au Club
    Envoyé par MaitrePylos
    Oups bien vu.
    J'ai mélangé le tuto fais pour le boulot avec celui-ci.
    Tu as raison, la fonction est bien dans public.
    Merci pour ton retour ^^

    Cependant j'ai un souci, quand je revoke les droits a anonymous le fait de faire une requête sans token fonctionne toujours ...
    Je me suis rendu compte que le fait d'avoir
    Code :
     GRANT readall TO anonymous;
    fait que meme si anonymous a tous les droits revoked il switch automatiquement sur readall, une erreu au niveau du tutoriel ou j'ai fait mal quelque chose ?
    Comment je peux régler cela svp ?
  • IchCodes
    Candidat au Club
    Envoyé par MaitrePylos
    Oups bien vu.
    J'ai mélangé le tuto fais pour le boulot avec celui-ci.
    Tu as raison, la fonction est bien dans public.
    Envoyé par IchCodes
    Merci pour ton retour ^^

    Cependant j'ai un souci, quand je revoke les droits a anonymous le fait de faire une requête sans token fonctionne toujours ...
    Je me suis rendu compte que le fait d'avoir
    Code :
     GRANT readall TO anonymous;
    fait que meme si anonymous a tous les droits revoked il switch automatiquement sur readall, une erreu au niveau du tutoriel ou j'ai fait mal quelque chose ?
    Comment je peux régler cela svp ?
    J'ai fini par trouver.
    Dans le tutoriel on donne la possibilité à anonymous de changer de rôle :

    Code :
    GRANT readall TO anonymous;
    Or il faut donner a authenticator la possibilité de changer de role :

    Code :
    GRANT readall TO authenticator;
    Pour le reste tout fonctionne, merci pour ce tutoriel qui m'as énormément facilité !