Erreur 504 via yunohost/sso portalapi (debian Bookworm)

T’es sur ? Chez moi ça s’affiche devant la toute dernière ligne, avant l’invite de commande

chez moi ça donne

root@pigeonsrapides:~# curl -v -X POST http://127.0.0.1:6788/login -d "credentials=foo:bar"
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 127.0.0.1:6788...
* Connected to 127.0.0.1 (127.0.0.1) port 6788 (#0)
> POST /login HTTP/1.1
> Host: 127.0.0.1:6788
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Length: 19
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 401 Unauthorized
< Content-Length: 16
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 07 Nov 2024 18:53:24 GMT
< 
* Connection #0 to host 127.0.0.1 left intact
Invalid passwordroot@pigeonsrapides:~# 

Oui pardon, en effet c’est qu’il n’y a pas de retour à la ligne. La dernière est bien celle ci :

Invalid password

Mouaibon éventuellement on peut tester en tapant des vrais identifiants à la place de “foo:bar” dans la commande (il faut du coup mettre user:password avec un vrai nom d’user et un vrai password …)

NB: si la commande renvoie une longue chaine de caractère “cookie: …” il ne faut bien penser à effacer le vrai contenu de cette chaine

Déjà essayé de mon côté, ça donne ça pour mes deux utilisateurs :

Trying 127.0.0.1:6788…
Connected to 127.0.0.1 (127.0.0.1) port 6788 (#0)
POST /login HTTP/1.1
Host: 127.0.0.1:6788
User-Agent: curl/7.88.1
Accept: /
Content-Length: 33
Content-Type: application/x-www-form-urlencoded

HTTP/1.1 401 Unauthorized
Content-Length: 22
Content-Type: text/html; charset=UTF-8
Date: Thu, 07 Nov 2024 18:58:15 GMT

Connection #0 to host 127.0.0.1 left intact
Unable to authenticate

Okay, est-ce que suite à ça il y a des infos intéressantes dans le retour de sudo tail /var/log/yunohost-portalapi.log -n 100 et sudo journalctl -u yunohost-portal-api -n 100 --no-pager --no-hostname

Ok en fait ça sert à rien si on précise pas le nom de domaine, du coup il faut rajouter l’option -H "Host: nom.de.domaine.tld" :

curl -H "Host: domaine.tld" -X POST http://127.0.0.1:6788/login -v -d "credentials=user:password"

root@pigeonsrapides:~# curl -H "Host: domaine.tld" -X POST pigeonsrapides.fr 0.0.1:6788/login -v -d "credentials=pigeon_1:BONMDP"
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying [fe80::21b:24ff:fe48:1d4e]:80...
* Connected to pigeonsrapides.fr (fe80::21b:24ff:fe48:1d4e) port 80 (#0)
> POST / HTTP/1.1
> Host: domaine.tld
> User-Agent: curl/7.88.1
> Accept: */*
> Content-Length: 34
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx
< Date: Thu, 07 Nov 2024 19:05:07 GMT
< Content-Type: text/html
< Content-Length: 138
< Connection: keep-alive
< Location: https://domaine.tld/yunohost/admin
< 
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host pigeonsrapides.fr left intact
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 0.0.0.1:6788...
* connect to 0.0.0.1 port 6788 failed: Connexion terminée par expiration du délai d'attente
* Failed to connect to 0.0.0.1 port 6788 after 130651 ms: Couldn't connect to server
* Closing connection 1
curl: (28) Failed to connect to 0.0.0.1 port 6788 after 130651 ms: Couldn't connect to server

Heu ben je sais pas ce que t’as fait là … il faut remplacer domaine.tld par ton vrai nom de domaine, et ne pas toucher au 127.0.0.1 …

En effet cette fois c’est différent, j’ai bien une réponse 200 :

Trying 127.0.0.1:6788…
Connected to 127.0.0.1 (127.0.0.1) port 6788 (#0)
POST /login HTTP/1.1
Host: nomdedomaine.tld
User-Agent: curl/7.88.1
Accept: /
Content-Length: 33
Content-Type: application/x-www-form-urlencoded

HTTP/1.1 200 OK
Content-Length: 9
Content-Type: text/html; charset=UTF-8
Set-Cookie: yunohost.portal=xxxxxxxxxxxxxxxxxxxxx
Date: Thu, 07 Nov 2024 19:06:15 GMT

Connection #0 to host 127.0.0.1 left intact

Comme tu l’auras surement compris j’ai caché la partie Cookie. Au niveau des logs ça donne :

2024-11-07 20:06:07,221 DEBUG geventwebsocket.handler.run_application - Initializing WebSocket
2024-11-07 20:06:07,222 DEBUG geventwebsocket.handler.upgrade_websocket - Validating WebSocket request
2024-11-07 20:06:07,223 DEBUG geventwebsocket.handler.upgrade_websocket - Can only upgrade connection if using GET method.
2024-11-07 20:06:15,125 INFO geventwebsocket.handler.log_request - 127.0.0.1 - - [2024-11-07 20:06:15] “POST /login HTTP/1.1” 200 622 7.903287

Et toujours rien de neuf sur le journalctl de yunohost-portal-api

Moké … et alors si maintenant on passe par nginx avec quelque chose comme ça :

DOMAIN=ton.domaine.tld
curl --insecure --resolve $DOMAIN:443:127.0.0.1 -X POST https://$DOMAIN/yunohost/portalapi/login -v -d "credentials=user:password"

(il faut toujours remplacer ton.domaine.tld, user et password par les vraies infos)

C’est le retour de la 504 :sweat_smile:

<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>

Le retour tail associé à la requête :

2024-11-07 20:15:57,548 DEBUG geventwebsocket.handler.run_application - Initializing WebSocket
2024-11-07 20:15:57,549 DEBUG geventwebsocket.handler.upgrade_websocket - Validating WebSocket request
2024-11-07 20:15:57,550 DEBUG geventwebsocket.handler.upgrade_websocket - Can only upgrade connection if using GET method.
2024-11-07 20:16:05,450 INFO geventwebsocket.handler.log_request - 127.0.0.1 - - [2024-11-07 20:16:05] “POST /login HTTP/1.1” 200 613 7.901798

Moké … Et si on essaye avec la route “public” est-ce que ça ça marche ? (plus besoin de user/password ici)

DOMAIN=ton.domaine.tld
curl --insecure --resolve $DOMAIN:443:127.0.0.1 https://$DOMAIN/yunohost/portalapi/public

(pas besoin de partager le vrai retour de la commande, ça devrait juste afficher un truc style {"public": ...}

{“public”: false, “portal_logo”: “”, “portal_theme”: “system”, “portal_tile_theme”: “simple”, “portal_title”: “Yunohost”, “show_other_domains_apps”: 0, “domain”: “nomdedomaine.tld”, “portal_public_intro”: “”, “search_engine”: “”, “search_engine_name”: null, “apps”: {}}

Tu veux le retour d’autre chose en parrallèle ?

Non je contemple simplement ma perplexation … j’arrive pas à comprendre pourquoi ça marcherait pour /public mais pas pour /login … et que ça bloque seulement en passant par nginx … j’essaye de comprendre ce qui pourrait bloquer dans le code mais je vois pas trop … ou alors y’a un truc chelou qui se passe dans nginx …

Est-ce que tu as des apps particulières installées sur ce domaine précisément (pas sur des sous domaine) ? Est-ce par hasard tu aurais activé le setting de sécurité “expérimentale” ?

Je suis conscient que ce n’est pas le cas le plus simple de dépannage. La sécurité expériementale n’est pas activée et comme dit dans le post initial, je n’ai sur mon domaine qu’une application qui est le VPN Client (dernière version installée).

En regardant les paramètres Yunohost, est-ce que ça pourrait être lié à ce paramètre ? Pourquoi n’est-il pas configuré par défaut sur moderne ?

Ah, intéressant qu’il y ait VPN client … Mais on est d’accord que tu n’as pas de problème pour te connecter à la webadmin ?

En passant par la webadmin (yunohost/admin), non je n’ai jamais eu de soucis similaire