Ich versuche, den folgenden Code zu implementieren, aber etwas funktioniert nicht. Hier ist der Code:
var session_url = 'http://api_address/api/session_endpoint';
var username = 'user';
var password = 'password';
var credentials = btoa(username + ':' + password);
var basicAuth = 'Basic ' + credentials;
axios.post(session_url, {
headers: { 'Authorization': + basicAuth }
}).then(function(response) {
console.log('Authenticated');
}).catch(function(error) {
console.log('Error on Authentication');
});
Es wird ein 401-Fehler zurückgegeben. Wenn ich es mit Postman mache, gibt es eine Option zum Festlegen der Basisauthentifizierung. Wenn ich diese Felder nicht ausfülle, wird auch 401 zurückgegeben. Wenn ich dies jedoch tue, ist die Anforderung erfolgreich.
Irgendwelche Ideen, was ich falsch mache?
Hier ist ein Teil der Dokumente der API, wie dies implementiert wird:
Dieser Dienst verwendet grundlegende Authentifizierungsinformationen im Header, um eine Benutzersitzung einzurichten. Anmeldeinformationen werden gegen den Server validiert. Wenn Sie diesen Webdienst verwenden, wird eine Sitzung mit den übergebenen Benutzeranmeldeinformationen erstellt und eine JSESSIONID zurückgegeben. Diese JSESSIONID kann in den nachfolgenden Anforderungen zum Tätigen von Webdienstaufrufen verwendet werden. *
Der Grund, warum sich der Code in Ihrer Frage nicht authentifiziert, liegt darin, dass Sie die Authentifizierung im Datenobjekt und nicht in der Konfiguration senden, wodurch sie in die Header eingefügt wird. Gemäß den Axios-Dokumenten lautet der Alias für die Anforderungsmethode
post
:Damit Ihr Code funktioniert, müssen Sie daher ein leeres Objekt für Daten senden:
Gleiches gilt für die Verwendung des von @luschn genannten auth-Parameters. Der folgende Code ist äquivalent, verwendet jedoch stattdessen den Parameter auth (und übergibt auch ein leeres Datenobjekt):
quelle
Aus bestimmten Gründen blockiert dieses einfache Problem viele Entwickler. Ich hatte viele Stunden mit dieser einfachen Sache zu kämpfen. Dieses Problem so viele Dimensionen:
CORS
Mein Setup für die Entwicklung ist mit einer vuejs-Webpack-Anwendung, die auf localhost: 8081 ausgeführt wird, und einer Spring-Boot-Anwendung, die auf localhost: 8080 ausgeführt wird. Wenn Sie also versuchen, die Rest-API vom Frontend aus aufzurufen, kann der Browser ohne die richtigen CORS-Einstellungen keine Antwort vom Spring-Backend erhalten. Mit CORS kann der XSS-Schutz (Cross Domain Script) moderner Browser gelockert werden. Soweit ich weiß, schützen Browser Ihr SPA vor einem Angriff durch ein XSS. Natürlich schlugen einige Antworten auf StackOverflow vor, ein Chrome-Plugin hinzuzufügen, um den XSS-Schutz zu deaktivieren, aber dies funktioniert wirklich UND wenn dies der Fall wäre, würde das unvermeidliche Problem nur für später verschoben.
Backend-CORS-Konfiguration
So sollten Sie CORS in Ihrer Spring Boot-App einrichten:
Fügen Sie eine CorsFilter-Klasse hinzu, um der Antwort auf eine Clientanforderung die richtigen Header hinzuzufügen. Access-Control-Allow-Origin und Access-Control-Allow-Header sind das Wichtigste für die Basisauthentifizierung.
Fügen Sie eine Konfigurationsklasse hinzu, die Spring WebSecurityConfigurationAdapter erweitert. In dieser Klasse injizieren Sie Ihren CORS-Filter:
Sie müssen nichts in Bezug auf CORS in Ihren Controller einfügen.
Vorderes Ende
Jetzt müssen Sie im Frontend Ihre Axios-Abfrage mit dem Authorization-Header erstellen:
Hoffe das hilft.
quelle
Ein Beispiel (axios_example.js) mit Axios in Node.js:
Stellen Sie sicher, dass Sie in Ihrem Projektverzeichnis Folgendes tun:
Anschließend können Sie die Node.js-REST-API mit Ihrem Browser unter folgender Adresse testen:
http://localhost:5000/search?queryStr=xxxxxxxxx
Ref: https://github.com/axios/axios
quelle
Die von luschn und pillravi gegebene Lösung funktioniert einwandfrei, es sei denn, Sie erhalten in der Antwort einen Strict-Transport-Security- Header.
Durch Hinzufügen von withCredentials: true wird dieses Problem behoben .
quelle