Перенаправить в профиль после входа - PullRequest
0 голосов
/ 18 апреля 2020

Я делаю Google Auth с паспортом, и я хочу перенаправить в профиль после успешного входа в систему.

Проблема заключается в моем методе this.props.history.push('/profile') не работает.

Кстати, именно от моего роутера мне нужно перенаправить пользователя в профиль. Вся аутентификация находится на маршруте.

Вот мой код, любые предложения?

Значение if (user) {} верно, моя единственная проблема заключается в том, как перенаправить пользователя.

Маршрут:

const Strategy = require('passport-local').Strategy
const mongoose = require('mongoose')
const GoogleUser = require('../models/google');

const GoogleAuth = new Strategy(
  { passReqToCallback: true, usernameField: "email", passwordField: "id" },
  function(req, email, id, done) {
    GoogleUser.findOne({ email: req.body.email })
      .lean()
      .exec((err, user) => {
        if (err) {
          return done(err, null);
        }
        if (!user) {
          let newUser = new GoogleUser({
            email: req.body.email,
            id: req.body.id,
            name: req.body.name,
            token: req.body.token,
            image: req.body.image
          });

          newUser.save((error, inserted) => {
            if (error) {
              return done(error, null);
            }

            return done(null, inserted);
          });
        }

        if (user) {
          this.props.history.push("/profile");
        }
      });
  }
);


module.exports = GoogleAuth;

Вот код реакции, если необходимо:

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 ]

0 голосов
/ 19 апреля 2020

Вы также можете использовать компонент Redirect из «act-router-dom »и вернуть его взамен

import { Redirect } from "react-router-dom";

// Your code
render() {
  if (User) {
    return <Redirect to={"/route"} />
  }
  return(
  // If user is not logged...
  )
}
0 голосов
/ 19 апреля 2020

Я только что сделал 2 разных маршрута в одном логине и одном регистре.

И это прекрасно работает.

0 голосов
/ 19 апреля 2020

вам нужно использовать «withRouter» из «act-router-dom ». Все, что вам нужно сделать, это импортировать с помощью роутера и обернуть ваш компонент при экспорте:

import { withRouter } from "react-router-dom";
//.
//.
//.
export default class (withRouter(Login))
...