Freebox Server (Ultra V9/ Pop V8/ Delta V7 / Revolution V6 / Mini 4K)

  • Status Nouveau
  • Percent Complete
    0%
  • Task Type Anomalie
  • Category Freebox OS → API
  • Assigned To No-one
  • Operating System Tous
  • Severity Low
  • Priority Very Low
  • Reported Version 4.5.8
  • Due in Version Undecided
  • Due Date Undecided
  • Votes 1
  • Private

FS#36981 - [résolu] 2022, API mafreebox.freebox.fr, session token, erreur dans la Doc

Bonjour à tous,

pour info,
après plusieurs essais infructeux dans tous les sens
j'ai enfin réussi à obtenir un session token


la doc API intégrée à la freebox (https://mafreebox.freebox.fr/doc/index.html#)
est erronée concernant le calcul du "password".

ce password est necessaire dans la requête du session token

—> dans la doc est écrit
—> dans le paragraphe "Obtaining a session_token"/"password string"
—> password = hmac-sha1(app_token, challenge) (←– CECI NE FONCTIONNE PAS)

avec le password ainsi calculé,
j'obtenais en réponse à la requête de session token (POST http)

Status Code: 403 Forbidden
msg: Erreur d'authentification de l'application
error_code: invalid_token

Pour que ça fonctionne,
il faut inverser app_token et challenge dans la formule

(CECI CI-DESSOUS FONCTIONNE)
(variables challenge et app_token préalablement attribuées bien sûr)

#en php
$password = hash_hmac("sha1", $challenge, $app_token); 

#ou en bash
password=$(echo -n $challenge | openssl sha1 -hmac $app_token | cut -d '=' -f2 | sed 's/ //g')

—> et avec le bon password, ça passe mieux
—> session_token (enfin) reçu :-)


en remarques complémentaires (de ce que j'en ai compris),

- l'app_token une fois sollicité/autorisé/validé est pérenne 
- le challenge par contre, à une durée de validité courte (30 secondes), 
  validité courte qui est donc conférée au password. 
  Et donc pour réussir l'obtention du session_token, 
  la requête/obtention du challenge, le calcul du password et la requête du session_token 
  doivent être fait pendant cette période de validité de 30 secondes.
- je suppose que le session_token est relativement pérenne  
  (pas pu tester longtemps) mais on sait maintenant comment en solliciter un autre...

HTH,
cordialement,
hého

hého commented on 31.08.2022 13:33

Bonjour,

pour compléter sur les remarques complémentaires de la fin du message précédent,
après test, la durée de validité du session_token est de 30 minutes.

HTH,
cordialement,
hého

Bonjour

désolé je n'ai pas vu le poste plus tôt…

En bash, depuis OpenSSL 3+ avec Debian12 (contrairement à openssl 1.1.1n en Debian =<11) l'expression fournie plus haut ne fonctionne plus :

[[ "$(openssl version |cut -d' ' -f2)" != "1.1.1n" ]] && \
    local password=$(echo -n "$challenge" | openssl dgst -sha1 -hmac "$APP_TOKEN" | sed  's/^SHA1(stdin)= //') || \
    local password=$(echo -n "$challenge" | openssl dgst -sha1 -hmac "$APP_TOKEN" | sed  's/^(stdin)= //')
    echo password=$password

Concernant la durée d'expiration du token, en effet c'est environ 30 minutes mais on s'en sort assez bien depuis son terminal bash avec les fonctions permettant de s'auto relogin

# Login to Freebox API and export to subshell _APP_ID and _APP_ENCRYPTED_TOKEN (reused by library)
login_freebox () {
    local _MY_APP_ID="$1"
    local _MY_APP_TOKEN="$2"

    login_fbx "$_MY_APP_ID" "$_MY_APP_TOKEN"
    export _APP_ID=${_MY_APP_ID}
    export _APP_ENCRYPTED_TOKEN=$(echo ${_MY_APP_TOKEN}|openssl enc -base64 -e -aes-256-cbc -salt -pass pass:${_APP_PASSWORD} -pbkdf2)
}

# login an app automatically based on login_freebox exported variables _APP_ID and _APP_ENCRYPTED_TOKEN
# this function does not need you to pass APP_ID and APP_TOKEN again. It create the possibility 
# of autologin of the library after fist login and without calling it again with your APP_ID and APP_TOKEN
app_login_freebox () {
        local _MY_APP_ID=${_APP_ID}
        local _MY_APP_TOKEN=$(echo "${_APP_ENCRYPTED_TOKEN}"|openssl enc -base64 -d -aes-256-cbc -salt -pass pass:${_APP_PASSWORD} -pbkdf2)
        source ${BASH_SOURCE[0]}
        #echo -e "_MY_APP_TOKEN=$_MY_APP_TOKEN \n_MY_APP_ID=$_MY_APP_ID"  # debug
        login_freebox "$_MY_APP_ID" "$_MY_APP_TOKEN" || return 1
}

# check if currently logged-in 
check_login_freebox () {
    local answer=
    local session=

    answer=$(call_freebox_api 'login')
    session=$(get_json_value_for_key "$answer" "result.logged_in")
    [[ "${session}" == "true" ]] || return 1
}

# relogin if session id disconnected
relogin_freebox () {
    check_login_freebox || app_login_freebox
}

Et visiblement ça fonctionne aussi sur des sessions interractives websocket (par exemple pour récupérer les consoles des VM en websocket et les laisser idle pendant plusieurs heures sans perdre la connexion)

ws_session () {
sleep .5
#debug
echo $(date) >./wstemp.log
#/debug
while [[ $(pgrep websocat) ]] ;
        do
                bash -c "source ${BASH_SOURCE} && relogin_freebox"
                sleep 3
                #debug 
                echo  $(pgrep websocat) >>./wstemp.log
                echo $_SESSION_TOKEN >>./wstemp.log
                #/debug
        done
ctrlc
}

websocat_session () {
ws_session &
} 

# .... puis on ajoute dans la session de lancement de websocat la fonction websocat_session 

websocat_session && ${optsttys[@]} aa ${optssl[@]} websocat ${options[@]} ${optws[@]} ${optwscl[@]}:${wsurl}; ${optsttye[@]}

Je maintien une lib en bash qui exploite l'API et qui commence à faire pas mal de choses, si vous avez besoin contactez moi

Cordialement

Bonjour nbanda!

Je me greffe à cette demande. Merci beaucoup pour ta réponse super utile.

A tout hazard est-ce que tu publies publiquement cette librairie bash quelque part? J'ai commencé à faire quelques scripts mais mon niveau est nul et si ça existe déjà je n'ai pas envie de réinventer la roue.

Merci

Bonjour

Oui, j'ai d'ailleurs commit des fix et des fonctions pour les VM hier… mais désolé pas encore pu mettre la doc à jour avec les nouvelles fonctions, mais pas d'inquiétudes toutes les fonctions "frontend" ont leur "help" intégré car une fois la lib sourcée et une fois connecté, les fonctions "frontend" sont utilisables comme des programmes ou des commandes du shell bash.

La doc sur github et de nouvelles fonctions pour creer et modifier des vm arriveront prochainement.

La lib est ici :
https://github.com/nbanb/fbx-delta-nba_bash_api.sh

Un programme plus avancé de gestion des vm utilisant la lib :
https://github.com/nbanb/fbxvm-ctrl

La lib contient ~115 fonctions à date, et une grande partie est documentée sur la page du projet github

Lisez bien la doc des fonctions, normalement il y a tout ce qu'il faut pour que vous soyez autonome.

Je reste néanmoins disponible si vous avez des questions.

Cordialement
nbanba

Bonjour

Pour les VM, la lib supporte maintenant directement :

Now the following functions are usable directly from the library 
(= from the shell).
Documentation is not updated at the time I'm writing... 
But all functions include help and example (calling function with no parameters will print help)

VM supported function :

vm_add              ---> add a new vm
vm_adddisk       ---> add a new disk for a VM
vm_console       ---> launch VM console (through Freebox Websocket API - it act as an Out-Of-Band access)    
vm_deldisk        ---> remove a VM disk
vm_delete         ---> remove a VM 
vm_detail          ---> print VM configuration detail and status
vm_list           ---> list all VM 
vm_listdisk       ---> list all disks from a vmdisk directory
vm_modify       ---> modify VM parameters 
vm_param        ---> print detailed help of ALL VM parameters
vm_reload        ---> execute an ACPI shutdown and after start the VM again
vm_resizedisk    ---> resize vM disk
vm_resource      ---> print allocated and used ressources - json output
vm_restart        ---> hard stop VM (electricaly) and after start the VM again
vm_sconsole      ---> start VM and launch console just after starting VM 
vm_show          ---> list a specific VM
vm_shutdown      ---> send an ACPI shutdown command to the VM
vm_start            ---> simply start VM
vm_stop            ---> hard stop VM (electricaly)

Je n'ai pas encore écrit la doc mais chaque fonction dispose de son 'help' contenant des exemples.
Les autres fonctions de la library sont documentés sur la page github du projet

Cordialement
nbanba

Bonjour

Petite précision pour le maintien des sessions websocket:
Une fois la connexion websocket établie, on ne peut pas rafraîchir le $_SESSION_TOKEN sans relancer la connexion complète ⇒ ça kill la session courante.

Avec certains dirty hack en forkant sur des pipes, on y arrive mais comme écrit ce sont des dirty hacks et il est possible de perdre des paquets dans l'opération, aucune garantie…

Cependant l'ajout d'un low level keepalive dans le websocket résout le problème.
Les fonctions de la lib permettant l'accès à des flux websocket long (vm consoles, vm vnc display screen) ont ce keepalive dans le websocket et les sessions tiennent jusqu'à ce qu'on les kill (plusieurs jours si on veut).

Cordialement
nbanba

Loading...

Available keyboard shortcuts

Tasklist

Task Details

Task Editing