Ynh api via axios

Salut,

c’est simple, je n’arrive pas a utiliser l’api ynh via axios, je n’arrive a passer la première étape /login
pourtant quand je fais la requete avec curl en cli ça fonctionne (depuis une machine distante) https://yunohost.org/#/admin_api_fr
je dois louper qlq dans les headers, ou j’utilise pas la bonne “method”, je sais pas
y’a pas de raison ça devrait fonctionner
je dissèque ça et ça mais je trouve pas

j’ai systematiquement une erreur 405 method not allowed et parfois en plus CORS erreur

ma requete

axios.get('https://domain.tld/yunohost/api/login', { password: 'xxxxxxxxx' }, {
        headers: {
          'X-Requested-With': 'customscript',
          'Content-Type': 'application/x-www-form-urlencoded',
          'Access-Control-Allow-Origin': '*'
        }
      })

j’ai essayé avec post, get, options

Clairement il faut que ce soit une requete “post” … Et je ne suis pas sur pour le “Content-Type” (je connais pas axios, mais avec python requests, je sais qu’il y a deux facon de passer les données post et generalement il y en a qu’une seule qui marche)

Tu peux aussi regarder https://github.com/YunoHost/moulinette/blob/stretch-unstable/test/test_auth.py#L10

merci @Aleks

y’a rien a faire c’est désespérant :frowning:
je regarde aussi ça https://github.com/YunoHost/moulinette/commit/84c9a74d3380f59cdc9fda6aa5bf5fac9d619a0c
si je comprend bien ça

def test_ok_post_text():
    r = webtest.post("/", "test",
                     headers=[("Content-Type", "text/plain"),
                              ("X-Requested-With", "XMLHttpRequest")])
    assert r.status_code == 200


def test_ok_post_urlencoded():
    r = webtest.post("/", "test",
                     headers=[("Content-Type",
                               "application/x-www-form-urlencoded"),
                              ("X-Requested-With", "XMLHttpRequest")])
    assert r.status_code == 200


def test_ok_post_form():
    r = webtest.post("/", "test",
                     headers=[("Content-Type", "multipart/form-data"),
                              ("X-Requested-With", "XMLHttpRequest")])
    assert r.status_code == 200

avec ces headers ça devrait passer, mais non
en faite soit je ne mets rien comme headers, juste le param password, et le post est envoyé directement, mais j’ai un 403
soi je mets les headers, mais le navigateur envoie un preflight OPTIONS avant le POST, et je me prend un 405 method not allowed
je crois que ynh ne sait pas prendre en charge les preflight OPTIONS, non ?

mes diffrents essayes

axios({
        method: 'POST',
        url: 'https://domain.net/yunohost/api/login',
        data: qs.stringify({ 'password': 'XXXXXXXXX' }),
      })

-> 403

axios({
        method: 'POST',
        url: 'https://domain.net/yunohost/api/login',
        data: { password: 'xxxxxxxxxxxxxxxxx' }
      })

-> 405 sur le preflight OPTIONS

axios({
        method: 'POST',
        url: 'https://domain.net/yunohost/api/login',
        data: qs.stringify({ 'password': 'XXXXXXXXX' }),
        headers: {
          'X-Requested-With': 'customscript',
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      })

-> 405 sur le preflight OPTIONS

etc

les logs ynh

DEBUG    geventwebsocket.handler run_application - Initializing WebSocket
DEBUG    geventwebsocket.handler upgrade_websocket - Validating WebSocket request
DEBUG    geventwebsocket.handler upgrade_websocket - Can only upgrade connection if using GET method.
INFO     geventwebsocket.handler log_request - 127.0.0.1 - - [2020-03-27 11:51:10] "OPTIONS /login HTTP/1.1" 405 884 0.001103



DEBUG    geventwebsocket.handler run_application - Initializing WebSocket
DEBUG    geventwebsocket.handler upgrade_websocket - Validating WebSocket request
DEBUG    geventwebsocket.handler upgrade_websocket - Can only upgrade connection if using GET method.
INFO     geventwebsocket.handler log_request - 127.0.0.1 - - [2020-03-27 11:41:39] "POST /login HTTP/1.1" 403 837 0.001192

je ne soulève pas l’enthousiasme des foules apparement :frowning:
j’ai posé une issue là https://github.com/YunoHost/issues/issues/1533

Désolé, je travaille sur 12000 trucs en parallèle et ça m’ambiance effectivement pas trop … Je connais pas du tout ces histoires de “pre-flight” … Naivement je dirais que c’est un soucis avec ta lib “axios” mais c’est surtout parce que je l’ai jamais utilisé ni entendu parler …

Est-ce que tu arrives à reproduire le problème avec par exemple la librairie requests ?

avec request native du navigateur c’est exactement le mm résultat, le navigateur envoie automatiquement un pre-flight options pour vérifier qu’il peut faire du CORS, requete a quoi le serveur devrait répondre avec un Access-Control-Allow-Headers: Authorization dans ces headers pour que le navigateur autorise le CORS. Sauf que ynh repond un 405 method not allowed, et donc la vraie requete n’est jamais envoyée (bloquée par le navigateur)
ça ne dépend pas de la librairy mais de ynh

      var myHeaders = new Headers()
      myHeaders.append('Content-Type', 'application/x-www-form-urlencoded')
      myHeaders.append('X-Requested-With', 'customscript')

      const request = new Request('https://domain.tld/yunohost/api/login', { method: 'POST', body: '{"password": "xxxxxxxxxxxxxxxxxxxxx"}', headers: myHeaders })

      fetch(request)
        .then(response => {
          if (response.status === 200) {
            console.log('response', response)
            return response.json()
          } else {
            throw new Error('Something went wrong on api server!')
          }
        })
        .then(response => {
          console.debug(response)
          // ...
        }).catch(error => {
          console.error(error)
        })
18:58:12.073 XHR OPTIONS https://domain.tld/yunohost/api/login
[HTTP/2 405 Method Not Allowed 180ms]

Request URL:https://domain.tld/yunohost/api/login
Request Method:OPTIONS
Remote Address:ip.ip.ip.ip:443
Status Code:
405
Version:HTTP/2
	
Response Headers (726 B)	
Raw Headers
allow	
OPTIONS
content-length	
740
content-security-policy	
upgrade-insecure-requests
content-security-policy-report-only	
default-src https: data: 'unsafe-inline' 'unsafe-eval'
content-type	
text/html; charset=UTF-8
date	
Thu, 02 Apr 2020 16:58:06 GMT
server	
nginx
set-cookie	
SSOwAuthRedirect=;; Path=/yuno…re; HttpOnly; SameSite=Lax ;;
strict-transport-security	
max-age=63072000; includeSubDomains; preload
x-content-type-options	
nosniff
x-download-options	
noopen
X-Firefox-Spdy	
h2
x-frame-options	
SAMEORIGIN
x-permitted-cross-domain-policies	
none
x-sso-wat	
You've just been SSOed
x-xss-protection	
1; mode=block
Request Headers (462 B)	
Raw Headers
Accept	
*/*
Accept-Encoding	
gzip, deflate, br
Accept-Language	
en-US,en;q=0.5
Access-Control-Request-Headers	
x-requested-with
Access-Control-Request-Method	
POST
Cache-Control	
no-cache
Connection	
keep-alive
Host	
domain.tld
Origin	
http://dev.localdomain
Pragma	
no-cache
Referer	
http://dev.localdomain/
User-Agent	
Mozilla/5.0 (X11; Linux x86_64…) Gecko/20100101 Firefox/75.0

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.