node.js - 使用 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 并返回,查询字符串参数似乎会丢失。
谢谢
解决方案
我为解决这个问题所做的是将用户的原始路径存储到会话中,并在身份验证完成后将它们重定向回它。
在调用护照验证方法之前,我添加了一个名为 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 包。
推荐阅读
- python - python的ecdsa库有问题
- mysql - 如何解决这个 MySQL 和 Django 连接的问题
- http - Flutter 转换 UTF-8 字符 HTTP post
- blazor - Blazor:包含主页脚本和样式的最佳方式是什么?
- elasticsearch - JSON层次结构中的弹性搜索动态字段
- google-analytics - 如何在 Google Tag Manager 中修改虚拟网页浏览的绝对网页 URL 以执行跨域跟踪?
- django - Django:“NoneType”对象在将 DateField 分配给模型类方法中的变量时没有属性“strftime”错误
- python-3.x - 将 SHAPE_RESTORE_SHX 配置选项设置为 YES 以恢复或创建它
- java - 将 UTC 时间转换为本地时间,同时使用本地年/月/日并指定小时/分钟 JAVA
- bootstrap-4 - 使用 Slick carousel 在不同断点上显示不同数量的幻灯片