0
votes

Rediriger vers le profil après la connexion

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 ceci.props.history.push ('/ profil') code> ne fonctionne pas. P>

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 si (utilisateur) {} code> est vrai mon seul problème est sur Comment rediriger l'utilisateur. P>

Route: 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;


12 commentaires

GoogleAuth ne ressemble pas à un composant réactif, qu'est-ce qui pourrait ceci.props 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 . 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 qui ressemble à ce qu'il appuie finalement "/ profiler", et je vois le rediriger 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.


3 Réponses :


0
votes

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))


0 commentaires

0
votes

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


0 commentaires

0
votes

Je viens de faire 2 itinéraires différents dans un identifiant et un registre.

et ça marche parfaitement.


0 commentaires