Fonction API avec paheko

Salut,

je suis confronté à un petit soucis avec l’application Yunohost. Certains voudraient utiliser l’Api, mais ça semble coincer, pourtant on ajouter dans l’installation de Yunohost l’api…

dans le manifest.toml

    [resources.permissions]

          main.url = "/"
          api.url = "/api"
          api.allowed = ["visitors", "all_users"]
          api.show_tile = false
          api.protected = true
          api.auth_header = true

Par contre quand on teste l’api par exemple

curl https://user_api:password_api@paheko.domaine.tld/api/download -o association.sqlite

on reçoit un fichier

<html>
      <head><title>301 Moved
      Permanently</title></head>

      <body>
      <center><h1>301 Moved
      Permanently</h1></center>
      <hr><center>nginx</center>
      </body>
 </html>

Quelqu’un semble avoir trouvé ce contournement:

Après plusieurs essais, j’ai trouvé une solution, mais elle ne me plaît pas beaucoup.
1 Dans Paheko, tu crées un utilisateur pour l’API.
2 Dans yunohost, tu crées un utilisateur avec l’identifiant et le mot de passe créé en 1
3 Tu lui donnes la permission Paheko (dans Groupes et Permissions).
Tu peux utiliser l’ API !!!

D’où ma question, est-ce que je dois ajouter l’utilisateur de l’app dans le config.local.php ? qui a un mot de passe générer pour le mail, j’imagine que je devrais mettre le même ??

J’ai un truc comme ça pour les mails

      const SMTP_USER = '__APP__';      
      const SMTP_PASSWORD = '__MAIL_PWD__';

Peut-être il faudrait ajouter à l’installation la constante API_USER avec le même mot de passe que celui utilisé pour le mail ?? Les essais ne fonctionnent pas ainsi non plus

      const API_USER = '__APP__';
      const API_PASSWORD = '__MAIL_PWD__';

J’avoue ne pas trop savoir comment faire marcher cette api, tous ces tests n’ont pas fonctionné…

Peut-être est-ce un soucis avec nginx ? avec cette ligne ?

  location ~ \.php$ {
    if (!-e $request_filename) {
      rewrite ^__PATH__/?(.*)$ __PATH__/_route.php?/$1 last;
      break;
    }
    fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock

Je demande souvent aussi au développeur de Paheko…
Sa réponse aux même intérogations

J’ai l’impression qu’il y a une fonctionnalité de Yunohost qui
interfère au niveau de la transmission du nom d’utilisateur.

Non il ne faut pas configurer API_USER / API_PASSWORD normalement.

À mon avis il faut que tu te rapproche des gens de YNH

Après quelques tests, je pense qu’il faut utiliser https et non http

curl https://user_api:password_api@paheko.domaine.tld/api/download -o association.sqlite

des essais avec wget au lieu de curl me le confirme

 wget http://user_api:password_api@paheko.domaine.tld/api/download --auth-no-challenge -O association.sqlite
URL transformed to HTTPS due to an HSTS policy
--2024-04-28 22:51:25--  https://user_api:password_api@paheko.domaine.tld/api/download
Résolution de paheko.domain.tld (paheko.domain.tld)… xxxx:xxxx:x:xxxx::x, xxx.xxx.xx.xx
Connexion à paheko.domain.tld (paheko.domain.tld)|xxxx:xxxx:x:xxxx::x|:443… connecté.
requête HTTP transmise, en attente de la réponse… 401 Unauthorized
Schéma d’authentification inconnu.

Bien commenter aussi le sso dans la conf nginx

 # Include SSOWAT user panel.
#  include conf.d/yunohost_panel.conf.inc;

Je trouve ce log dans /var/log/nginx/paheko.mon.domaine.tld-error.log après une tentative curl

2024/04/28 23:37:55 [error] 396128#396128: *1263 [lua] helpers.lua:386: authenticate(): Connection failed for: user_api, client: xxxx:xxxx:xxx:xxxx::x, server: paheko.domain.tld, request: "GET /api/download HTTP/2.0", host: "paheko.domain.tld"

Du coup je me demande si c’est lié à cela ??

Là je retrouve le code du helpers.lua où l’erreur c’est arrêtée

    if connected then
        if conf['ldap_enforce_crypt'] then
            ensure_user_password_uses_strong_hash(connected, user, password)
        end
        cache:add(user.."-password", password, conf["session_timeout"])
        ngx.log(ngx.NOTICE, "Connected as: "..user)
        logger.info("User "..user.." successfully authenticated from "..ngx.var.remote_addr)
        return user


    -- Else, the username/email or the password is wrong
    else
        -- N.B. : the ngx.log is important and is related to the regex used by
        -- the fail2ban rule to detect (and ban) failed login attempts
        ngx.log(ngx.ERR, "Connection failed for: "..user)
        logger.error("Authentication failure for user "..user.." from "..ngx.var.remote_addr)
        return false
    end
end

et je me dis que cette règle a banni la tentative de connexion peut-être pour la règle ensure_user_password_uses_strong_hash ???

Je comprends aussi que ces tentatives sont du coup bannies par fail2ban en cherchant avec mon ip

cat /var/log/fail2ban.log |grep xxxx:xxxx:xxx:xxxx::x
2024-04-28 22:09:47,976 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-28 22:09:47
2024-04-28 22:48:59,775 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-28 22:48:59
2024-04-28 22:51:05,968 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-28 22:51:05
2024-04-28 22:51:26,280 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-28 22:51:26
2024-04-28 23:37:55,891 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-28 23:37:55
2024-04-29 00:10:51,803 fail2ban.filter         [2313865]: INFO    [yunohost] Found xxxx:xxxx:xxx:xxxx::x - 2024-04-29 00:10:51

Un nouvel essai

cette fois je change une chose dans le manifest.toml

 api.url = "/api/*"
curl -v http://user_api:passwd_user_api@paheko.domain.tld/api/download -o association.sqlite 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2xxx:xxxx:xxx:xxxx::xx]:80...
* Connected to paheko.domain.tld (2xxx:xxxx:xxx:xxxx::xx) port 80 (#0)
* Server auth using Basic with user 'user_api'passwd_user_apiTTP/1.1
> Host: paheko.domain.tld
> Authorization: Basic bWR6bHZjYnhscTpSWGExYlRYMUFYZzhRa1dVcWhrMmd3
> User-Agent: curl/7.88.1
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx
< Date: Thu, 16 May 2024 20:31:20 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: https://paheko.domain.tld/api/download
< 
{ [162 bytes data]
100   162  100   162    0     0    900      0 --:--:-- --:--:-- --:--:--   905
* Connection #0 to host paheko.domain.tld left intact

Bon toujours pas… Peut-être que api.auth_header devrait être false ??

le header Authorization de nginx c’est le mdp de ton user yunohost connecté qui est forwardé à l’app…

Je ne comprends pas tout… Par contre ici la ligne bWR6bHZjYnhscTpSWGExYlRYMUFYZzhRa1dVcWhrMmd3 correspond en base64 à user_api:passwd_user_api… que j’ai supprimé depuis…

Une solution a été trouvé !

à tester sur la branche testing :

Bonjour Rodinux,
Tu ne lâches pas l’affaire ;+)
J’ai suivi tes posts et tenté de charger la version testing.
La version se charge bien, et on peut y accéder directement sans passer par l’identification du portail. Ce sera un plus pour les utilisateurs de l’asso.
J’ai fait cet essai sur mon réseau local perso. Le serveur est un raspberry Pi3 avec yunohost mis à jour pour Bookworm. J’ai un sous-domaine spécifique pour Paheko_testing. J’ai fait l’essai en recopiant les données de mon serveur de prod, puis en repartant d’une confog vierge en recréant un nouvelle association.
Dans les 2 cas, le retour est identique, on a toujours

curl https://toto:incongru@test.mondomaine.nohost.me/api/sql/ -d 'SELECT * FROM users LIMIT 5;'

<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

Le résutat est le même quelle que soit la commande envoyée…
pour le fun, j’ai utilisé un utilisateur et un mot de passe quelconque, non connu de ynh et de paheko !!!
Bon courage
Yves C.

Pour moi ça fonctionne, pourquoi ça ne fonctionnerai pas chez toi ??

curl https://user_api:motdepasse_api@paheko.domain.tld/api/sql/ -d 'SELECT * FROM users LIMIT 5;'

me renvoi un .json avec toutes les infos…

J’ai créer un user api dans les fonctions avancées juste avec «peut lire les données…»

Tu dois créer un user api dans l’admin de paheko avant, paheko va te créer un mot de passe à garder avant de le sauver.

Pour accéder à l’API il faut un identifiant et un mot de passe, à créer dans le menu Configuration, onglet Fonctions avancées, puis API.

Est-ce que tu peux essayer avec un curl -v pour voir avoir une réponse verbeuse ?

C’était déjà le cas, où je me trompe ?? Tu l’installes bien en public ou en privé ?

Si il est en privé, je pense que c’est un soucis pour l’api…

Je teste cette fonction api sur un serveur avec 2 paheko (paheko et paheko__2). Ça devrait fonctionner…

Je viens de tester sur un serveur avec Bookworm, ça fonctionne aussi…

Bonsoir Rodinux,
J’ai enfin trouvé mon erreur ;+)))
J’ai installé paheko avec les accès pour le groupe all_users uniquement.
Je viens d’ajouter visiteurs et ça marche !!!
Merci pour le travail effectué.
Je vais maintenant m’attaquer à l’utilisation de l’API dans les modules
Bonne continuation
Yves