Ich bin ziemlich neu zu ReactJS.Reactjs mit Fetch für Auth und Zugriff Token, nicht in der Lage, Antwort zu analysieren
Ich verwende Chrome Browser.
Ich versuche, die Anmeldeseite mit ReactJS zu erstellen. Die Seite ist einfach mit Benutzer-ID und Passwort. Die Authentifizierung findet auf unserem SSO-Server statt. Das bedeutet, dass ich Daten auf dem Server mithilfe von fetch call posten muss und access_token
als Antwort erhalten muss.
Das Problem ist, wie folgt:
Ich bin nicht Antwort in der Konsole zu bekommen. Wenn ich jedoch die Registerkarte "Netzwerk" in den Entwicklertools betrachte, kann ich sehen, dass es eine gültige Antwort mit allen erforderlichen Feldern gibt, einschließlich access_token
darin. Jetzt sicher, wie soll ich das analysieren.
Ist dies, weil fetch
Async-Aufruf ist?
Hier ist mein gesamter Seitencode.
S.: Ein Teil des Codes wird nicht formatiert.
import React, {Component} from 'react';
import '../App/App.css';
import {FormGroup, FormControl, InputGroup} from 'react-bootstrap';
class Auth extends Component {
constructor(props) {
super(props);
this.state = {
userid: '',
password: '',
accessToken: ''
}
}
submit() {
console.log('state', this.state);
const BASE_URL = 'MY SSO URL';
const params = {
'grant_type': 'password',
'username': this.state.userid,
'password': this.state.password,
'client_secret': 'secred',
'client_id': 'client_id',
};
const formData = new FormData();
for (let p in params) {
formData.append(p, params[p]);
}
const headers = {
'Access-Control-Allow-Origin': '*'
};
const request = {
method: 'POST',
headers: headers,
body: formData,
mode: 'no-cors'
};
fetch(BASE_URL, request)
.then((response) => response.text())
.then((responseText) => {
console.log('text',responseText);
})
.catch((error) => {
console.warn(error);
});
console.log('all done');
}
render() {
return (
<div className="login">
<div className="legend">Signin</div>
<FormGroup>
<InputGroup>
<div className="input">
<FormControl
type="text"
placeholder="Enter User Id or email"
onChange={event => this.setState({userid: event.target.value})}
onKeyPress={
event => {
if (event.key === 'Enter') {
this.submit()
}
}}
/>
</div>
<div className="input">
<FormControl
type="password"
placeholder="enter password"
onChange={event => {
console.log(event.target.value)
this.setState({password: event.target.value})
}}
onKeyPress={
event => {
if (event.key === 'Enter') {
this.submit()
}
}}
/>
</div>
<FormControl
type="submit"
onClick={() => this.submit()}
/>
</InputGroup>
</FormGroup>
</div>
)
}
}
export default Auth;
Ich versuchte response.json()
dies gibt Fehler wie: Unexpected end of input
.
Dank und Sie sind genau das Richtige in Bezug auf die Verwendung von nicht-cors und Header ‚Access-Control-Allow-Origin‘: ‚*‘ und wenn ich diese nicht verwende ich Störung erhalte. Aber mein Curl-Befehl funktioniert gut, keine Probleme, daher bin ich etwas verwirrt, was in meinem Front-End-Code fehlt. – artofabhishek
Dies ist, was ich bekomme, wenn ich Kopfzeile und no-cors entfernen "Nein 'Access-Control-Allow-Origin' Header ist auf der angeforderten Ressource vorhanden. Ursprung 'http: // localhost: 3000' ist daher nicht erlaubt eine undurchsichtige Antwort dient Ihren Bedürfnissen, stellen Sie den Modus der Anfrage zu ‚no-cors‘ die Ressource mit CORS deaktiviert zu holen. Aber Locke ist alles gut, es gab keine Probleme. – artofabhishek
Also ja das Problem ist, dass der BASE_URL Server nicht sendet die Access-Control-Allow-Origin-Antwort-Header Ich habe die obige Antwort aktualisiert, um eine längere Erklärung hinzuzufügen. Der Grund, warum es in curl funktioniert, ist, dass curl sein Verhalten nicht ändert, je nachdem, ob es das Access-Steuerelement findet oder nicht. Control-Allow-Origin Antwortheader, aber Browser tun dies. – sideshowbarker