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…