使用PassportJS在Facebook登录后将用户重定向到原始URL

时间:2018-06-25 13:18:58

标签: node.js express passport.js facebook-authentication

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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