使用 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 包。