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