首页 > 解决方案 > 使用 PassportJS 在 Facebook 登录后将用户重定向到原始 URL

问题描述

我已经使用 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 并返回,查询字符串参数似乎会丢失。

谢谢

标签: node.jsexpresspassport.jsfacebook-authentication

解决方案


我为解决这个问题所做的是将用户的原始路径存储到会话中,并在身份验证完成后将它们重定向回它。

在调用护照验证方法之前,我添加了一个名为 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 包。


推荐阅读