Access refused by CSRF protection in main.inc.php

Bonjour,

Je ne parviens absolument pas à faire une requête API vers mon dolibarr (je commence donc, cela n’a jamais fonctionné pour moi).

# grep csrf htdocs/conf/conf.php
$dolibarr_nocsrfcheck='1';

Mais j’ai aussi ajouté en GUI

CSRFCHECK_WITH_TOKEN = 0
MAIN_SECURITY_CSRF_WITH_TOKEN = 0

Je fais cette requête curl
$ curl -X POST -H "DOLAPIKEY: 2v8yzT0FKtmsHRT4O3WoZt69g6KttK63" -H "Content-Type: application/json" -H "Accept: application/json; indent=4" -H "Referer: http://dolibarr.mondomaine.org" " http://dolibarr.mondomaine.org/api/index.php/thirdparties --data '{ "name": "NOM123", "email": "", "client": "1", "code_client": "-1" }'

Et j’ai l’erreur suivante

Access refused by CSRF protection in main.inc.php. Referer of form () is outside the server that serve this page (with method = POST).
If you access your server behind a proxy using url rewriting, you might check that all HTTP headers are propagated (or add the line $dolibarr_nocsrfcheck=1 into your conf.php file to remove this security check).

Pour faire ma requête, j’ai mis en dur dans /etc/hosts
1.2.3.4 dolibarr.mondomaine.org
Et j’ai utilisé HTTP au lieu de HTTPS volontairement.
Je peux ainsi faire une capture réseau si besoin.

Quand j’execute curl avec l’option -v je vois bien

> POST /api/index.php/thirdparties HTTP/1.1
> Host: dolibarr.mondomaine.org
> User-Agent: curl/8.9.0
> DOLAPIKEY: 2v8yzT0FKtmsHRT4O3WoZt69g6KttK63
> Content-Type: application/json
> Accept: application/json; indent=4
> Referer: http://dolibarr.mondomaine.org
> Content-Length: 69

Le message d’erreur m’indique qu’un token n’est pas fourni alors que normalement c’est sous la forme DOLAPIKEY

Un utilisateur est créé et a une clé/token attribuée, il a tous les droits sur les tiers

Cordialement

Bonjour,

j’utilise l’API également et je n’ai pas eu besoin de désactiver le CSRF. Il vaut mieux remettre et chercher d’où ça vient le problème.

Bonjour,

Dans le code la vérification se fait sur l’existence ou non de cette constante, sa valeur n’est pas prise en compte.
Donc le fait de mettre zéro ne désactive rien, il faut supprimer la constante.

1 « J'aime »

Bonjour
La requête me parait un peu courte.
La structure est la suivante :

$url   = 'https://monsite.truc/api/index.php';
$headers = ['Accept: application/json',
'DOLAPIKEY: '.$token, //la clé api rangée en sécurité quelque part
'contact_list: 1',
];
			curl_setopt_array($curl, [
					CURLOPT_URL            => sprintf($param,$url,$search), //$param contient le repertoire de recherche pour la requete
					CURLOPT_RETURNTRANSFER => true,
					CURLOPT_ENCODING       => 'utf-8',
					CURLOPT_MAXREDIRS      => 10,
					CURLOPT_TIMEOUT        => 30,
					CURLOPT_FOLLOWLOCATION => true,
					CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_2TLS,
					CURLOPT_CUSTOMREQUEST  => 'GET',
					CURLOPT_HTTPHEADER     => $headers,
				]
			);
 
			$response = curl_exec($curl);

A essayer dans postman par exemple pour ajuster les paramètres, tester les réponses et récupérer le code…
Francis

Bonjour,
Je ne sais pas si cela aidera pour votre problème mais j’avais du activer le paramètre Disable compression of API responses dans l’admin du module API pour le faire fonctionner.
Bon courage

Bonjour,

Merci pour vos réponses.
J’ai l’impression d’avoir un peu progressé.
J’ai modifié ma configuration Nginx.

Et à présent j’ai l’erreur suivante

{
    "error": {
        "code": 404,
        "message": "Not Found"
    },
    "debug": {
        "source": "Routes.php:457 at route stage",
        "stages": {
            "success": [
                "get"
            ],
            "failure": [
                "route",
                "negotiate",
                "message"
            ]
        }
    }
}

Pourriez-vous m’indiquer si la syntaxe du module est thirdparty ou thridparties ?

Je parviens à accéder à la page explorer de l’API via mon navigateur mais lorsque je mets ma DOLAPIKEY rien ne se passe

J’ai ouvert un nouveau sujet concernant la configuration Nginx car j’ai l’impression que les problèmes viennent de là.

Bonjour,
Pour résoudre le problème j’ai du refaire la configuration NGinx et m’assurer que cgi.fix_pathinfo est positionnée à 1 et non à 0