【问题标题】:How to pass data along with redirect using express?如何使用 express 传递数据和重定向?
【发布时间】:2021-08-03 07:08:01
【问题描述】:

我正在尝试使用我的 React 应用程序设置 SAML 单点登录。后端是快递/护照设置。前端是 Reactjs。

我加载了初始的 Reactjs SPA,它注意到我没有设置用户名。 ...然后它重定向到 SSO 页面。我输入我的信息(根据需要),然后在成功后指出身份提供者将我的客户转发回/login/callback 路由的位置。反过来,该路由应该将用户转发回其原始 URL(由 req.body.RelayState 定义)。

回调路由如下所示:

samlRouter.use(session(config.session));
samlRouter.use(passport.initialize());
samlRouter.use(passport.session());

samlRouter.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', req.header('origin'));
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-Width, Content-Type, Accept, Authorization');
    res.header('Access-Control-Allow-Credentials', 'true'); //SAML

    if (req.method == 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'PUT, POST, GET');
        return res.status(200).json({})
    }
    next();
})

samlRouter.post('/login/callback',
    (req, res, next) => {
        passport.authenticate('saml', config.saml.options)(req, res, next)
    },
    (req, res, next) => {
        console.log('req.user.nameID :>> ', req.user?.nameID);   // ***THIS IS CORRECT**
        req.session.user = req.user;

        return res.redirect(`${req.body.RelayState}`);
    });

问题是——我需要告诉前端 reactjs 应用程序的 req.user.nameID 是谁。我不能把它放在重定向的查询字符串中,因为它是登录名(因此任何想输入 xxxx.com/privatePage?myusername 的人都可以假装是我)。

身份验证后如何安全地将数据传递到我的前端?

【问题讨论】:

    标签: node.js reactjs express passport.js


    【解决方案1】:

    有多种方法可以通过重定向传递数据。

    1. 将数据放入作为重定向 URL 一部分的查询字符串中,以便在呈现重定向 URL 时数据在 URL 中可用。
    2. 将数据放入 cookie 中,该 cookie 将在呈现重定向的 URL 时显示。
    3. 将数据放入服务器端用户会话中,该会话将在呈现重定向的 URL 时出现。

    如果同一用户同时大量参与多个重定向,则选项 2 和 3 都存在潜在的并发问题或竞争条件。这些选项 2 和 3 还需要在使用数据后对其进行清理,以免闲置。

    如果需要,选项 2 和 3 比选项 1 更私密。如果此数据涉及身份验证(例如用户是谁并且需要安全),那么它确实应该在服务器端会话中(由会话 cookie 索引)。这通常会保存在会话中,因此它可以作为 req.session.user 用于未来的请求。

    【讨论】:

    • 如前所述,#1 不可行。我现在正在研究#2 的 JWT。对于#3,前端 reactjs 应用如何获取 req.session.user?
    • @lowcrawler - 前端不接req.session.user - 这是后端使用。但是,后端可以使用它来将某些内容呈现到前端可以使用的网页中(例如 Javascript 变量)。
    • ... 那么,回到最初的问题,然后:如何在进行重定向的同时将这个“javascript 变量”从后端发送到前端?
    • @lowcrawler - 选项 2 或 3 - 将其放入前端可以直接读取的 cookie 中或放入会话中,然后使用会话数据将 javascript 变量渲染到重定向页面中然后前端可以读取。
    • 我想从技术上讲你回答了这个问题。我应该更清楚如何 - 从技术上讲 - 我可以做这些事情。查看新问题:stackoverflow.com/questions/67512088/…
    猜你喜欢
    • 2020-09-29
    • 2021-08-03
    • 2022-08-05
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多