Паспорт 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');
});

0 ответов

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