Next.js-Passport Как получить данные пользователя после успешного входа в систему? [Маршрутизация на стороне клиента]

Я пытаюсь получить доступ к данным пользователя после успешного входа в систему, а также из каждого компонента. Вот как я вхожу в систему:

    router.post("/user/login",(req,res,next)=>{

    passport.authenticate('local', function(err, user, info) {
        console.info(JSON.stringify(user)) // here i got user data
        if (err) { return next(err); }
        if (!user) { return res.send("fail"); }
        req.logIn(user, function(err) {
          if (err) { return next(err); }
          return res.send("success") // when client gets success message,it will do Router.push("/dashboard")

        });
      })(req, res, next);


}) 

Конфигурация сервера:

  server.use(cookieParser())
  server.use(bodyParser.json())
  server.use(passport.initialize());
  server.use(session({
  secret: 'jumpingdonger',
  resave: true,
  saveUninitialized: true,
  cookie : { secure : false, maxAge : (4 * 60 * 60 * 1000) }, // 4 hours
}))
//Passport Middleware
server.use(passport.initialize())
server.use(passport.session())

Страница DashBoard:

import Header from '../components/Header'

import Layout from '../components/MyLayout.js'
import React, { Component } from 'react';
import axios from 'axios';
import Router from 'next/router'


export default class DashBoard extends Component{

  constructor(props) {
    super(props);



    this.state = { 


    };
  }  
  componentWillMount(){
console.info(this.props)

  }


  logout =()=>{
    axios.get('/api/user/logout').then((result)=>{

            if (result.data= = "success"){
                Router.push("/")
            }

    })



  }
  render(){
    if (this.props.userData == undefined){
      return(
        <Layout>
       <p>First you must login!</p>

    </Layout>
      )
    }else{
      return(

        <Layout>
               <p>Welcome to your dashboard {this.props.userData.userName}</p>

               <a onClick = {this.logout}>logout</a>
            </Layout>


        )

    }





  }




}
DashBoard.getInitialProps = async function(context) {

  if (context.req !=undefined){ // which means that we are from server
    return { 
      userData:context.req.user


       };
  }else{
    return{}
  }

  }

Итак, после успешного входа в систему я перенаправляюсь на страницу панели инструментов. Теперь в компоненте панели инструментов я пытаюсь получить данные пользователя на getInitialProps. Проблема в том, что я перенаправлен клиентом, использующим Router.push(), я не могу получить данные на getInitialProps, если я не обновлю страницу с браузер.Если я обновляюсь, context.req.user заполняется данными пользователя. Итак, как мне получить доступ к данным пользователя с маршрутизацией на стороне клиента со страницы панели инструментов, а также со всех других страниц? Я не мог понять, помещает ли это пользовательские данные в файл cookie, к которому я могу получить доступ с клиента, или это сеанс на стороне сервера? Благодарность

Обновлено: Я решил проблему, передав userData с сервера на клиент при успешном входе в систему и установив cookie на стороне клиента. Интересно, это правильное решение в данном случае?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 808
2

Ответы 2

Если пользователь вошел в систему. passport будет создавать объект user в req для каждого запроса в express.

if (req.user) {
  // logged in
} else {
  // not logged in
}

В next.js, когда вы используете getInitialProps, у вас есть доступ к серверу с context.req. нравится:

static async getInitialProps({req}){
 if (req){
   // called on server
   // here you can check for that user object
 } else {
  // called on client
 }

}

Однако этот код будет работать, если у вас есть запрос SSR в приложении next.js (обновите страницу или введите URL-адрес и нажмите ввод).

Вы аутентифицируетесь на сервере, поэтому нет возможности узнать, есть ли у вас то же самое во внешнем интерфейсе, если вы не используете токен и не проверите токен во внешнем интерфейсе. Взгляните на Экспресс-сессия, который поможет вам с файлами cookie.

Привет, спасибо за ответ. Наконец-то мне удалось получить доступ к пользовательским данным внутри context.req.user. Но, как вы сказали, если используется маршрутизация на стороне клиента, я не мог получить к нему доступ. Так что я все еще ищу способ доступа к пользовательским данным на клиенте боковая маршрутизация

lastpeony4 15.01.2019 00:34

Для решения этой проблемы вам нужно будет использовать хранилище redux. Если вы настроили свой магазин redux, вам необходимо перенести его в свой магазин redux. Добавьте этот код в свой файл _app.js. Ваши страницы могут подключаться к магазину.

  componentDidMount () {
   const { pageProps: { user }, reduxStore: { dispatch } } = this.props
   if (user) {
     dispatch({
       type: FETCH_USER,
       payload: user
    })
   }
  }

Другие вопросы по теме