web-dev-qa-db-fra.com

HTTP403: INTERDIT - Le serveur a compris la demande, mais refuse de l'exécuter.

Je continue à avoir l'erreur 403 ci-dessus lors de l'exécution d'un appel AJAX à une API. 

L'erreur se produit dans Microsoft Edge, mais pas dans IE, Chrome, Firefox ou Safari.

La page n'utilise pas d'amorçage, car j'ai lu que cela pouvait être dû au fait que la page n'avait pas été en mesure de localiser les fichiers .LESS requis. J'ai même essayé d'inclure bootstrap pour voir si cela résolvait le problème - ce n'était pas le cas.

Il semble que je ne sois pas capable de trouver quoi que ce soit en recherchant ceci, à part quelques trucs Twitter Oauth et la réponse bootstrap ci-dessus - Ces deux éléments ne sont pas pertinents pour ma candidature.

Comme je l'ai déjà indiqué, l'appel AJAX fonctionne dans tous les navigateurs, à l'exception de Edge. Le code est exactement le même sur les différents navigateurs et les en-têtes de réponse/demande se correspondent - la requête POST n'envoie donc pas de données incorrectes (en cas de configuration par défaut différente de celle du navigateur) .

C'est ce que j'essaie de réaliser:

index.html contient 4 annonces de logement iFrames. Mon code Javascript récupère ensuite la balise iFrame et superpose une icône en forme de pouce levé/baissé où l’utilisateur peut donner son avis sur lesdites publicités. L'appel AJAX reçoit l'URL de la publicité (iFrame src) et l'ID de l'utilisateur (consommateur_id). Il renvoie ensuite un ID d'impression après avoir écrit dans la base de données pour enregistrer l'action de levée/descente.

Exemple de code:

index.html:

<body>
    <iframe src="https://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1&amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA%3D%3D&amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?" width="728" height="90" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" bordercolor="#000000"></iframe>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script type="text/javascript" src="client.js"></script>
</body>

Appel AJAX:

    // This isn't usually a var, but added for clarity. Usually uses a selector 
    // to grab the entire iframe DOM element, and then store in array.    
        var iframe = "http://ad.doubleclick.net/ddm/adi/N4406.154378.CRITEO/B9862737.133255611;sz=728x90;click=http://cat.fr.eu.criteo.com/delivery/ck.php?cppv=1&amp;cpp=ZNbxVXxoRmlURGJwS3JrRUZxTXVnNG83QmlTRUhSNDgzZEFXeEt6Q2VkcXpuTlFXTzBPUytNL0t3QW1NR2hiWXMyU1Jjb0NsTDZZQk8ybzRnajZnZlNodTJKNjhiSW8yaFlPTVBDRUlZQjJ5QVNUQjQrNHd5UEJicEI5OS95NUUxMWVDbGRZamZ4RjZYS1FHam5LQ1dpcENzanhtcEhlckpmOEVuSUhRTllIQnBPazlnMnQ3eWVJcjhOSzRYOXYwOXlqYVFrTnI0eDZJSTBjR1lGM2VUVVloQjd3RlJUcndIQUl3NUpRalY0YXV3Q29SRktKSkFJSktueU0vMVdydko4UzZGSldkbUR1RUR4MTU2a0loamFYZlpiZz09fA%3D%3D&amp;maxdest=;dcopt=anid;ord=f4840e2d31;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?";

        $.ajax({
            method: 'POST',
            url: 'http://my.api/url/',
            async: false,
            datatype: 'json',
            data: {
                ad_url: iframe, // fetch ad_url from iframe src
                wittel_consumer: "57fcea30f910092a06806344"
            },
            success: function(data, respText, xhr) {
                console.log('Data',data);
                console.log('XHR',xhr);
            },
            error: function(error) {
                console.log('URL',this.url);
                console.log('Error',error);
            }
        });

Dans ce code, le AJAX est activé, mais retourne sous la méthode 'error'. Je peux voir que l'URL est correcte et, à l'intérieur du rappel error, je viens d'obtenir un objet contenant le type readyState: 4, status: 403, statusText: "Forbidden". Comme indiqué, l’API fonctionne, car elle est exécutée avec succès dans n’importe quel autre navigateur. Elle doit donc être liée à la manière dont Edge traite la demande. Ou pourrait-il être une chose de configuration du serveur? Honnêtement, je n'en ai aucune idée.

Erreur complète: HTTP403: FORBIDDEN - The server understood the request, but is refusing to fulfill it. (XHR)POST - http://my.api/url/

4
Scott Thornton

Pour toute autre personne ayant ce problème:

J'ai mis mon code sur un serveur et j'ai couru à partir de là pour vérifier si c'était la connexion localhost - ce qui était le cas.

L'API que j'utilise doit être configuré pour ne pas autoriser les connexions localhost, ce que je n'avais jamais connu auparavant.

Excellent moyen de perdre 2 jours et de perdre votre santé mentale cependant!

Merci pour les suggestions ci-dessus quand même. L'apprécier.

4
Scott Thornton

S'il vous plaît inclure les informations d'identification dans les options.

var url = 'https://dummy_url/_api/lists'
var options = {
    headers: {"Accept": "application/json; odata=verbose"},
    credentials: 'include'
}

fetch(url, options).then( 
    res => res.json().then(json => console.dir(json)) 
)

Cela fonctionne pour moi.

1
Roy Selim

Je viens d'avoir le même problème.

Il s'est avéré que cela a quelque chose à voir avec certains des enregistrements de la base de données. Les opérations fonctionnent sans heurts dans la plupart des enregistrements, mais sur certains, je reçois le 403 et, si j’insiste, 500.

D'après ma propre expérience, cela n'a rien à voir avec localhost. Ça fonctionne bien. Cela a à voir avec certains de vos enregistrements ... recherchez la duplicité sur des champs non clés mais auxquels il est fait référence dans vos requêtes.

0
Jay Ell III

Essayez d'ajouter ces paramètres à votre demande:

"headers": {
    "Content-Type": "application/json",
    "cache-control": "no-cache",
},
"processData": false,
0
Guildenstern70