使用 PassportJS 登录 Facebook 后将用户重定向到原点 URL
Redirect the user to origin URL after Facebook login using PassportJS
我已经使用 PassportJS 设置了 Facebook 身份验证,但是我无法将用户重定向回他们原来的 URL。
这些是路线:
app.get("/api/auth/facebook", passport.authenticate("facebook", { scope: ["public_profile", "email"] }));
app.get(
"/api/auth/facebook/callback",
passport.authenticate("facebook", { failureRedirect: "/login" }),
(req, res) => {
logger.debug("Successful authentication");
res.redirect("/");
}
);
我将在此处省略策略代码,因为我不确定它是否相关,但它是漂亮的样板,没有什么不同。
我的问题是如何在回调中访问原始 URL,而不是将用户重定向回“/”?一旦请求转到 Facebook 并返回,查询字符串参数似乎就丢失了。
谢谢
我解决这个问题的方法是将用户的原始路径存储到会话中,并在身份验证完成后将他们重定向回会话。
我在调用 passport 验证方法之前添加了一个名为 storeRedirectToInSession 的中间件,如下所示:
app.get(
"/api/auth/facebook",
storeRedirectToInSession,
passport.authenticate("facebook", { scope: ["public_profile", "email"] })
);
app.get(
"/api/auth/facebook/callback",
passport.authenticate("facebook", { failureRedirect: "/login" }),
(req, res) => {
logger.debug("Successful authentication");
res.redirect(req.session.redirectTo);
}
);
中间件:
const storeRedirectToInSession = (req, res, next) => {
let url_parts = url.parse(req.get("referer"));
const redirectTo = url_parts.pathname;
req.session.redirectTo = redirectTo;
next();
};
这需要 'url' 节点包。
我也在使用 express 和 express-session 包。
我已经使用 PassportJS 设置了 Facebook 身份验证,但是我无法将用户重定向回他们原来的 URL。
这些是路线:
app.get("/api/auth/facebook", passport.authenticate("facebook", { scope: ["public_profile", "email"] }));
app.get(
"/api/auth/facebook/callback",
passport.authenticate("facebook", { failureRedirect: "/login" }),
(req, res) => {
logger.debug("Successful authentication");
res.redirect("/");
}
);
我将在此处省略策略代码,因为我不确定它是否相关,但它是漂亮的样板,没有什么不同。
我的问题是如何在回调中访问原始 URL,而不是将用户重定向回“/”?一旦请求转到 Facebook 并返回,查询字符串参数似乎就丢失了。
谢谢
我解决这个问题的方法是将用户的原始路径存储到会话中,并在身份验证完成后将他们重定向回会话。
我在调用 passport 验证方法之前添加了一个名为 storeRedirectToInSession 的中间件,如下所示:
app.get(
"/api/auth/facebook",
storeRedirectToInSession,
passport.authenticate("facebook", { scope: ["public_profile", "email"] })
);
app.get(
"/api/auth/facebook/callback",
passport.authenticate("facebook", { failureRedirect: "/login" }),
(req, res) => {
logger.debug("Successful authentication");
res.redirect(req.session.redirectTo);
}
);
中间件:
const storeRedirectToInSession = (req, res, next) => {
let url_parts = url.parse(req.get("referer"));
const redirectTo = url_parts.pathname;
req.session.redirectTo = redirectTo;
next();
};
这需要 'url' 节点包。 我也在使用 express 和 express-session 包。