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

У меня есть экспресс-приложение, работающее на localhost: 3000, где я выполняю аутентификацию по паспорту js, и реактивное приложение, работающее на localhost: 8080.Когда пользователь аутентифицируется, я сохраняю информацию в хранилище mobx (по аналогии с redux), но когда страница обновляется, все исчезает.

Я хочу иметь URL-адрес на сервере, к которому я могу запросить текущийактивный пользователь (то есть localhost: 3000 / auth / getActiveUser), и он должен дать мне зарегистрированного пользователя.Когда я захожу на localhost: 3000 / auth / getActiveUser из браузера, он работает просто отлично.Но проблема в том, что когда я выполняю выборку с клиента, экспресс-файл cookie, т.е. connect.sid, не передается в качестве заголовка, то есть fetch(THE_URL_ABOVE).Я пытался передать cookie вручную в качестве заголовка, но сервер не хочет аутентифицировать мой запрос.

Есть идеи, как это можно сделать?

server.js

import express from 'express';
import passport from 'passport';
import session from 'express-session';

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

const MongoDBStore = require('connect-mongodb-session')(session);

const app = express();
const store = new MongoDBStore({
  uri: 'mongodb://localhost:27017/bloggingApp',
  collection: 'userSessions',
});

store.on('error', (err) => {
  console.log(err);
});

middleware(app);

app.use(session({
  secret: keys.session.cookieKey,
  resave: false,
  saveUninitialized: false,
  store,
  cookie: { httpOnly: false }, // false so I can access it as document.cookie on front end
}));

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

my authRoutes.js, который имеет все маршруты аутентификации

passport.serializeUser((user, done) => {
  // done(err, usr prop to make a cookie)
  done(null, user.id);
});

// get a user from the id
passport.deserializeUser(async (id, done) => {
  const usr = await User.findById(id);
  // attach usr to req later
  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) => {
  console.log(people);
  // callback for auth
  // if user not found, then save
  let usr = await User.findOne({ googleID: people.id });
  // save user in users collection
  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();
    console.log('new user created');
  } else {
    console.log('The user is ', usr);
  }
  // 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.send('logout using passport');
  res.set('Content-Type', 'text/html');
  res.end(popupTools.popupResponse({
    status: true,
    message: 'Logged out!',
  }));
});

// callback after loging in
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,
      },
    }));
  }
);

// this needs to be fixed
authRouter.get('/getActiveUser', (req, res) => {
  console.log(req.isAuthenticated());
  res.json({
    user: req.user,
  });
});
...