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