Je fais Google Auth avec passeport et Je veux rediriger vers le profil après vous être connecté avec succès.
Le problème est ma méthode de Au fait, c'est de mon routeur que j'ai besoin de rediriger l'utilisateur pour profiler.
Toute l'authentification est dans la route. P> Voici mon code toute suggestion? P> Le Route: P> ceci.props.history.push ('/ profil') code> ne fonctionne pas. P>
si (utilisateur) {} code> est vrai mon seul problème est sur Comment rediriger l'utilisateur. P>
import React, { Component } from 'react';
import axios from "axios";
import {Redirect} from "react-router-dom"
import styles from '../styles/loginsignup.css'
import logo from '../img/nowyourguest.png'
import 'bootstrap/dist/css/bootstrap.min.css'
import 'jquery/dist/jquery.min.js'
import 'bootstrap/dist/js/bootstrap.min.js'
export default class Login extends Component {
componentDidMount() {
this.googleSDK();
console.log('sfsfd');
}
prepareLoginButton = () => {
console.log(this.refs.googleLoginBtn);
this.auth2.attachClickHandler(this.refs.googleLoginBtn, {},
(googleUser) => {
let profile = googleUser.getBasicProfile();
const email = profile.getEmail()
const id = profile.getId()
const name = profile.getName()
const token = googleUser.getAuthResponse().id_token
const image = profile.getImageUrl()
axios({
url: "/authentication/google",
method: "POST",
data: {
email,
id,
name,
token,
image
}
})
.then(response => {
const isAuthenticated = response.data.isAuthenticated
window.localStorage.setItem('isAuthenticated', isAuthenticated);
this.props.history.push('/profile')
})
.catch(error =>{
this.setState({
errorMessage:error.response.data.message
})
})
})
}
googleSDK = () => {
window['googleSDKLoaded'] = () => {
window['gapi'].load('auth2', () => {
this.auth2 = window['gapi'].auth2.init({
client_id: 'clientID',
cookiepolicy: 'single_host_origin',
scope: 'profile email'
});
this.prepareLoginButton();
});
}
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://apis.google.com/js/platform.js?onload=googleSDKLoaded";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'google-jssdk'));
}
state = {
email: '',
password: ''
};
handleSubmit = event => {
event.preventDefault();
const {email, password } = this.state;
axios({
url: "/authentication/signin",
method: "POST",
data: {
email,
password
}
})
.then(response => {
const isAuthenticated = response.data.isAuthenticated
window.localStorage.setItem('isAuthenticated', isAuthenticated);
this.props.history.push('/profile')
})
.catch(error =>{
this.setState({
errorMessage:error.response.data.message
})
})
};
handleChange = event => {
const {name, value} = event.target;
this.setState({
[name]:value
})
}
render() {
const isAuthenticated = window.localStorage.getItem('isAuthenticated');
if (isAuthenticated) {
return <Redirect to='/profile' />
}
return(
<div>
<div>
<nav className="navbar navbar-expand-lg navbar-light bg-info sticky-top" id="shadow">
<a className="navbar-brand text-warning" href="/">NowYourGuest</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon" />
</button>
<div className="collapse navbar-collapse" id="navbarSupportedContent" >
<ul className="navbar-nav mr-auto">
<li className="nav-item">
<a className="nav-link text-white" href="/add-your-accomodation">Add your accomodation</a>
</li>
<li className="nav-item active">
<a className="nav-link" href="/login">Login<span className="sr-only">(current)</span></a>
</li>
<li className="nav-item">
<a className="nav-link text-white" href="/signup">Signup</a>
</li>
</ul>
</div>
<form className="form-inline my-2 my-lg-0">
<input className="form-control mr-sm-2" type="search" placeholder="Search for accomodation" aria-label="Search" />
</form>
</nav>
</div>
<div className="container">
<div className="card card-container">
<center><img id="profile-img" className="profile-img" src={logo} /></center>
<p id="profile-name" className="profile-name-card" />
<form onSubmit={this.handleSubmit} className="form-signin">
<span id="reauth-email" className="reauth-email" />
<input type="text" id="inputEmail" className="form-control" name="email" onChange={this.handleChange} placeholder="Email address" required autofocus />
<input type="password" id="inputPassword" className="form-control" name="password" onChange={this.handleChange} placeholder="Password" required />
<center><p style={{color: 'red'}}>{this.state.errorMessage}</p></center>
<button className="btn btn-lg btn-primary btn-block btn-signin" type="submit">Sign in</button>
</form>
<button className="loginBtn loginBtn--google" ref="googleLoginBtn">Login with Google</button>
<a href="#" className="forgot-password">
Forgot the password?
</a>
</div>
</div>
</div>
)
}
}
module.exports = Login;
3 Réponses :
Vous devez utiliser "ROROTEUR" de "réacteur-routeur-dom". Tout ce que vous avez à faire est d'importer sans que vous puissiez envoyer votre composant à l'exportation:
import { withRouter } from "react-router-dom"; //. //. //. export default class (withRouter(Login))
Vous pouvez également utiliser un composant redirect à partir de "React-Router-Dom" et de le renvoyer à la place
import { Redirect } from "react-router-dom"; // Your code render() { if (User) { return <Redirect to={"/route"} /> } return( // If user is not logged... ) }
Je viens de faire 2 itinéraires différents dans un identifiant et un registre. P>
et ça marche parfaitement. P>
GoogleAuth code> ne ressemble pas à un composant réactif, qu'est-ce qui pourrait
ceci.props code> même être ici? En ce qui concerne la réaction, comment est-ce utilisé / consommé?
Oui, vous avez raison. D'autre manière pour diriger votre profil?
S'il vous plaît poster votre code de réagisme
Pouvez-vous partager votre code de réact qui consomme probablement l'authentification Google ou détermine sinon si un utilisateur est authentifié? C'est là que vous aurez accès à tous les accessoires de routage pour faire une poussée ou remplacer.
Toute l'authentification se trouve dans les itinéraires que je n'ai que rediriger vers une URL dans ma JSX rien d'autre.
Je vois. On dirait que tout votre trajet rendit directement les composants, ils ont donc au moins accès à des accessoires routiers. Pouvez-vous fournir l'un des codes du composant qui vérifie également l'Auth?
@ Decard fait
Intéressant. Il semble que vous appuyez sur «/ profiler» dans tous les endroits nécessaires dans votre
Connexion code>. Ceux qui ne fonctionnent pas comme prévu?
Ce sont pour le registre mais je veux pousser lorsque vous êtes connecté.
@ Drewreese J'essaie de m'inscrire et de vous connecter à partir du même JSX et de la même route qui est pourquoi .Pan je redirige de mon routeur ou devrais-je faire 2 itinéraires différents 1 pour le registre 1 pour la connexion?
Je suis fan de composants à un seul but, mais c'est mon avis. Désolé, j'ai du mal à essayer de choisir les pièces qui sont "login" à partir de "registre" et je ne vois pas la relation entre le composant réactif et l'objet Googleacheuth. Je vois un
googleloginbn code> qui ressemble à ce qu'il appuie finalement "/ profiler", et je vois le
rediriger code> dans le rendu si "authentifié". Cela peut vous aider à séparer les deux flux.
Je vais simplement faire 2 itinéraires séparés pour la connexion et vous inscrire.