web-dev-qa-db-fra.com

Ajax CORS Request avec http 401 dans le contrôle en amont

Je me bats depuis des heures maintenant. Je veux faire une simple requête ajax vers un autre domaine, mais obtenir l'erreur HTTP 401 tout le temps:

jQuery(document).ready(function($){
  var challengeid = $('#codepressHook').data('challengeid');
  var clicked = false;
  $('#codepressHook').click(function(){
    if(!clicked){
      $.ajax({
        url: "https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/"+challengeid+".json",
        method: "GET",
        dataType: "json",
        jsonp: false,
        contentType: "application/json",
        xhrFields: {
          withCredentials: true
        },
        beforeSend: function(xhr){
          xhr.setRequestHeader("Authorization", "Basic "+ btoa(username+":"+password));
        },
        success: function(data){
          $('#codepressHock').html(data.data.code);
        },
        error: function(error){
          alert(error);
        }
      });
    }
  });
});

Je mets tous les en-têtes CORS pertinents sur le côté serveurs. Voici le trafic réseau:

Request URL:https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/45.json
Request Method:OPTIONS
Status Code:401 Unauthorized
Remote Address:185.102.94.230:443
Referrer Policy:no-referrer-when-downgrade

Response Headers
view source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type, X-Requested-With, Authorization, Origin
Access-Control-Allow-Methods:POST, GET, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:http://radbonus.com
Access-Control-Max-Age:31536000
Content-Length:463
Content-Type:text/html; charset=iso-8859-1
Date:Sat, 24 Jun 2017 11:25:33 GMT
Server:Apache/2.4.18 (Ubuntu)
WWW-Authenticate:Basic realm="Admin"

Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Access-Control-Request-Headers:authorization,content-type
Access-Control-Request-Method:GET
Connection:keep-alive
Host:dev.radbonus.com
Origin:http://radbonus.com
Referer:http://radbonus.com/plugintest/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

Je sais qu'il y a beaucoup de messages sur ce sujet, mais il me manque quelque chose de simple. Quelqu'un pourrait-il m'aider?

3
lance dörksen

UPDATEOn dirait que je n'avais pas raison. L'entête Authorization n'est jamais envoyé pour la demande OPTIONS. Veuillez voir commentaire de sideshowbarker - vous devez vous assurer que votre serveur ne répond pas avec la demande de 401 à OPTIONS.

Je ne sais pas dans quelle langue votre serveur est écrit, mais vous avez implémenté l'autorisation de manière incorrecte - la méthode OPTIONS doit être exclue de l'auth. Voir aussi ici - OPTIONS demande d'authentification

La réponse ci-dessous est obsolète:

Votre serveur requiert une authentification HTTP Basic pour cette requête. Et vous ne fournissez pas d'informations d'identification. 401 erreur n'a rien à voir avec CORS; cela signifie simplement que le serveur a choisi de ne pas autoriser votre requête car vous n'avez pas fourni les informations d'authentification.

Si vous essayez d’ouvrir cette URL (comme https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/1.json ) directement dans le navigateur, il vous sera demandé de saisir votre identifiant et votre mot de passe. le navigateur traite l'erreur 401 avec l'en-tête WWW-Authenticate.

Veuillez noter que l'en-tête Authorization n'est en fait pas inclus dans votre demande. Ainsi, au lieu d'utiliser beforeSend hook, vous devriez probablement simplement inclure l'en-tête directement dans votre appel:

headers: {
    'Authorization': 'Basic ' + btoa(username+':'+password),
},

Et assurez-vous que Authorization header figure dans votre demande.

7
MarSoft

Veuillez ajouter des domaines croisés dans les en-têtes comme ceci:

$.ajax({
        url: "https://dev.radbonus.com/admin/affiliate-connections/retrieveSingle/"+challengeid+".json",
        method: "GET",
        dataType: "json",
        jsonp: false,
        contentType: "application/json",
        xhrFields: {
          withCredentials: true
        },
        crossDomain: true,
        beforeSend: function(xhr){
          xhr.setRequestHeader("Authorization", "Basic "+ btoa(username+":"+password));
 xhr.setRequestHeader("Access-Control-Allow-Origin",'*');
        },
        success: function(data){
          $('#codepressHock').html(data.data.code);
        },
        error: function(error){
          alert(error);
        }
      });
0
Pramod