0

亲爱的,

护照谷歌周围有很多例子,但应该有一些我错过的东西。我知道我的问题可能被标记为“可能重复”,但很抱歉我找不到答案,或者他们都没有解决我的问题。

用户单击客户端上的 href 链接(在https://localhost:3000上运行),调用服务器上的 googleauth 路由(在https://localhost上运行)。

在服务器端,passport 进程运行良好,callbackUrl 在服务器端 /googleauth/redirect。

然后在这个回调中,我可以将重定向硬编码为“ https://localhost:3000 ”。效果很好。

但我不想要这个。我希望服务器从客户端捕获初始 url(因此https://localhost:3000),将其保留在会话中,然后在重定向中使用此信息。

在 google auth 路由中,我在调用 passport.authenticate 之前将 toRedirect 变量设置到会话中,感谢中间件。

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

然而,一旦谷歌进程完成(选择谷歌帐户并确认访问用户数据),回调​​中的 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 身份验证结果发回给您的客户的?

这是代码

应用程序.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);
            };
));

谷歌路线

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

0 回答 0