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?
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.
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);
}
});