Паспорт Google: почему идентификатор сессии отличается в обратном вызове?
Dears,
Есть много примеров вокруг паспорта Google, но должно быть что-то, что я пропустил. Я знаю, что мой вопрос может быть помечен как "возможный дубликат", но извините, я не могу найти ответ, или ни один из них не решает мою проблему.
пользователь нажимает ссылку href на клиенте (работает по адресу https://localhost:3000/), вызывая маршрут googleauth на сервере (работает по адресу https://localhost/).
На стороне сервера процесс паспорта работает хорошо, callbackUrl на стороне сервера в /googleauth/redirect.
Затем в этом обратном вызове я могу жестко запрограммировать перенаправление на " https://localhost:3000/". это отлично работает
Но я не хочу этого. Я хочу, чтобы сервер перехватил исходный URL-адрес от клиента (поэтому https://localhost:3000/), сохранил его в сеансе и затем использовал эту информацию в перенаправлении.
В маршруте Google Auth я установил переменную toRedirect в сеанс благодаря промежуточному программному обеспечению, прежде чем вызывать passport.authenticate.
googleRouter.get('/', (req, res, next) => {
if (!req.session.toRedirect) req.session.toRedirect = req.socket.remoteAddress;
next();
}, Auth.passport.authenticate('google', {
scope: ['profile', 'email', 'https://mail.google.com/'],
accessType: 'offline',
prompt: 'consent',
session: false // <-- whatever true or false, same issue
})
);
Однако, как только процесс Google будет завершен (выберите учетную запись Google и подтвердите доступ к данным пользователя), sessionID будет отличаться в обратном вызове, поэтому URL для перенаправления не определен... И, конечно, удаленный адрес больше не является клиентом один, но API аутентификации Google один...
googleRouter.get('/redirect', Auth.passport.authenticate('google', { session: false }), (req, res) => {
console.log(req.session.toRedirect, req.sessionID, req.socket.remoteAddress) // <--- sessionID is different so req.session.toRedirect is undefined
res.redirect('https://localhost:3000'); /<--- hardocded here but I want res.redirect(req.session.toRedirect).
});
Итак, ребята, как вы отослали результаты Google Auth своим клиентам?
Вот код
apps.js
const passport = Auth.passport;
app.use(passport.initialize());
app.use(passport.session()); <-- whatever set or not, same issue
auth.js
const googleOptions = {
clientID: sds,
clientSecret: dsadd,
callbackURL: '/googleauth/redirect',
passReqToCallback: true
};
passport.use(new GoogleStrategy(googleOptions,
async (req, token, refreshToken, profile, done) => {
data = await Auth.helpers.signIn(req, null, 'google');
if (data && data.erreur == authErrors.NONE) {
// MAJ de la session et cookie
req.session.userId = data.user.id;
done(null, data.user);
};
));
googleroutes
googleRouter.get('/', (req, res, next) => {
if (!req.session.toRedirect) req.session.toRedirect = req.socket.remoteAddress;
next();
}, Auth.passport.authenticate('google', {
scope: ['profile', 'email', 'https://mail.google.com/'],
accessType: 'offline',
prompt: 'consent',
session: false
})
);
// callback route pour redirect google
googleRouter.get('/redirect', Auth.passport.authenticate('google', { session: false }), (req, res) => {
console.log(req.session.toRedirect, req.sessionID, req.socket.remoteAddress)
res.redirect('https://localhost:3000');
});