首页 > 解决方案 > 如何在使用 express/nodejs/passport 重定向时使用会话或 cookie 传递数据?

问题描述

请参阅上一个问题:如何使用 express 传递数据和重定向?

我的问题是我有一个 Reactjs SPA 和一个 NodeJS/Express/Passport 后端。快递后端正在发送一个res.redirect(%url%),但我无法与该重定向一起安全地发送其他信息。

上一个问题的答案是“发送 cookie 或在会话中发送数据”。如何才能做到这一点?

我目前的代码:

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 的人都可以假装是我)。据我了解,其他选项是“设置 cookie”和“使用会话”。

具体来说,我如何实现这两个其他选项之一以在身份验证后将数据安全地传递到我的前端?(上面代码块的倒数第二行)。

编辑:值得注意的是我的 API 服务器和我的前端文件主机是不同的——所以我需要一个跨站点解决方案。当然,有些系统使用我可以模拟的第三方身份验证系统。

标签: node.jsexpresspassport.js

解决方案


任何只想输入 xxxx.com/privatePage?myusername 的人都可以假装是我

Cookie 不能解决这个问题。用户可以轻松设置 cookie。

如果您想了解如何将身份验证和授权凭据安全地传递给公共客户端的示例,请阅读有关 OAuth 2.0授权代码授权的信息,这正是它解决的问题。


推荐阅读