PassportJs получает информацию о зарегистрированном пользователе на странице обновления в приложении реакции - PullRequest
0 голосов
/ 18 декабря 2018

Я создаю простое приложение для ведения блога с сервером, выполняющим аутентификацию с паспортом jsВот мой код сервера:

import express from 'express';
import passport from 'passport';
import cookieSession from 'cookie-session'; // encrypt cookie

import router from './routes/routes';
import authRouter from './routes/authRoutes';
import middleware from './middleware';
import keys from './keys';

const app = express();

// use cookies for login/logout session, send cookie to browser
// happens only when user logs in.
app.use(cookieSession({
  maxAge: 24 * 60 * 60 * 1000, // 1 day
  keys: [keys.session.cookieKey], // encrypt cookie
}));

app.use(passport.initialize());
app.use(passport.session());

// auth routes
app.use('/auth', authRouter);

Мой authRoutes.js

import Router from 'express';
import passport from 'passport';
import GoogleStrategy from 'passport-google-oauth20';
import popupTools from 'popup-tools';

import { User } from '../database/model';
import keys from '../keys';

passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser(async (id, done) => {
  const usr = await User.findById(id);

  done(null, usr);
});

passport.use(new GoogleStrategy({
  clientID: keys.google.clientID,
  clientSecret: keys.google.clientSecret,
  callbackURL: '/auth/google/redirect',
}, async (accessToken, refreshToken, profile, people, done) => {
  let usr = await User.findOne({ googleID: people.id });
  if (!usr) {
    const user = new User({
      name: people.displayName,
      email: people.emails[0].value,
      googleID: people.id,
      image: people._json.image.url,
    });

    usr = await user.save();
   }
  // calls serializeUser
  done(null, usr);
}));

const authRouter = Router();

authRouter.get('/google', passport.authenticate('google', {
  scope: ['profile', 'email'],
}));

authRouter.get('/logout', (req, res) => {
  req.logout();
  res.set('Content-Type', 'text/html');
  res.end(popupTools.popupResponse({
    status: true,
    message: 'Logged out!',
  }));
});

// callback for google auth
authRouter.get('/google/redirect',
  passport.authenticate('google'),
  (req, res) => {
    // here we have the user as req.user
    res.set('Content-Type', 'text/html');
    res.end(popupTools.popupResponse({
      status: true,
      message: {
        data: req.user,
      },
    }));
  }
);

// I want this route to get me the current user
authRouter.get('/getActiveUser', (req, res) => {
  res.json({
    user: req.user,
  });
});

export default authRouter;

Я использую popupTools, чтобы помочь войти с помощью всплывающего окна.На внешнем интерфейсе, когда пользователь входит в систему и всплывающее окно закрывается, я сохраняю пользовательскую информацию в хранилище mobx.Но когда я перезагружаю страницу, я не могу сохранить эту информацию.Мне нужен маршрут на моем сервере, например / getActiveUser, откуда я могу получить вход в систему пользователя, но он не работает.

1 Ответ

0 голосов
/ 18 декабря 2018

Вам нужно будет использовать либо localStorage API, либо sessionStorage в вашем приложении React.Я использую localStorage, например:

Сохранение объекта пользователя в localStorage после успешной аутентификации пользователя: localStorage.setItem('user', JSON.stringify(userObject));

Загрузка пользователя из localStorage после монтирования приложения Reactв браузере, используя ваш mobx, например: const user = JSON.parse(localStorage.getItem('user'));

, таким образом, у вас есть пользовательский объект, на случай, если вы захотите использовать его снова, таким образом вы сохраните сеанс пользователя.

в случае выхода из системы вы будете удалять элемент user из localStorage.localStorage.removeItem('user');

...