У меня есть экспресс-приложение, работающее на 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,
});
});