Je développe une web app back office pour un site web déjà existant (d'où l'utilisation de wordpresse alors que le front est en react) -> (front: js/react, back: php/wordpress)
Dans le but de récupérer une liste depuis le serveur, j'effectue une requête GET avec dans le header un token pour vérifier l'identité de l'utilisateur.
node: mapp.fetcher est seulement une surcouche à mapp qui intercepte les erreurs 500 et 401, dans le cas d'une réponse HTTP 200, il possède le même comportement que fetch a l'exception qu'il parse le json car je ne récupère que du json de mon api.
coté back (php):
add_action('init', 'fuck_you_cors');
add_action('rest_api_init', function() {
register_rest_route('v1', '/partners/getPrestationsByIdentifier', array(
'methods' => 'GET',
'callback' => 'getPrestationsByIdentifier',
'show_in_index' => false
));
});
function fuck_you_cors() {
header ("Access-Control-Allow-Origin: *");
header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS");
header ("Access-Control-Allow-Headers: *");
}
function getPrestationsByIdentifier(WP_REST_Request $req) {
try {
global $wpdb;
$token = $req->get_header('token');
if (!$token) {
return new WP_Error('401', 'acess denied', array("status" => 401));
}
$userId = getUserDataFromToken($token)->data->ID;
if (!$userId || !isValidToken($token, $userId)) {
return new WP_Error('401', 'acess denied', array("status" => 401));
}
$query = $wpdb->query("
SELECT p.*, pr.* FROM bo_posts AS p, bo_mapp_prestation AS pr
WHERE p.post_type='prestation'
and p.post_author='$userId'
and pr.post_id = p.id");
return array('status' => 200, 'list' => $wpdb->last_result);
} catch (Exception $ex) {
return new WP_Error('500', $ex->getMessage(), array('status' => 500));
}
}
le token est récupéré depuis le header, vérifié, puis requête SQL et réponse. Un add action permet de mettre les headers en rapport avec CORS pour les autorisation -> fuck_you_cors()
(note: oui après 1h a rechercher sur internet sans aucun message d'erreur autre de chrome, j'ai légèrement ragé)
Malgré le set des headers Access-Control (de plusieurs manières au fait: en global, dans la fonction API, add_action('init', ...)), rien n'y fait:
prestations:1 Access to fetch at 'https://pro.mapp.local:8890/wp-json/v1/partners/getPrestationsByIdentifier' from origin 'http://localhost:3000' has been blocked by CORS policy: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.
prestations:1 Uncaught (in promise) TypeError: Failed to fetch
note: pro.mapp.local est un domaine local redirigeant sur localhost, donc pas la peine d'essayer de requêter de chez vous.
Je précise que la requête fonctionne dans postman mais pas dans chrome (non testé avec d'autres navigateur cependant). J'ai essayé toutes les réponses sur google en rapport avec CORS, aucun résultat.
Merci de votre aide
- Edité par Zoraneus 19 septembre 2019 à 16:50:06
un projet ? Fait le ou ne le fait pas, il n'y a pas d'essai.
Yo, as tu essayais de mettre tes trois appels header() tout en haut de ton fichier, car dans la doc il disent:
Documentation php a écrit:
N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include ou require, et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.
Et l'action init de wordpress, aussi haute soit elle dans l'ordre d'initialisation de wordpress, peut être qu'elle se trouve après des includes et d'autres chose. Et la doc parle carrément de ligne vide et de caractères espace, donc c'est plutôt vicieux.
Yo, as tu essayais de mettre tes trois appels header() tout en haut de ton fichier, car dans la doc il disent:
Edité par apoz4 il y a environ 1 heure
Oui déjà essayé
de plus, c'est une api, pas un fichier html qui est envoyé.
- Edité par Zoraneus 20 septembre 2019 à 11:22:33
un projet ? Fait le ou ne le fait pas, il n'y a pas d'essai.
Problème de CORS dans php/Wordpress
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.