Паспорт Google: почему идентификатор сессии отличается в обратном вызове? - PullRequest
0 голосов
/ 05 января 2019

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 аутентификации гугл один ...

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');
});
...