亲爱的,
护照谷歌周围有很多例子,但应该有一些我错过的东西。我知道我的问题可能被标记为“可能重复”,但很抱歉我找不到答案,或者他们都没有解决我的问题。
用户单击客户端上的 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');
});