React(ES6)中如何访问Passport的req.user?API调用返回undefined的req.user

4
我正在使用React Starter Kit制作一个应用程序,使用Passport进行身份验证。我现在正处于尝试在前端访问req.user对象的阶段,但我无法将该req.user对象传递到React/ES6环境中。我尝试将对象作为prop和context传递,但都没有成功。因此,我决定创建一个API端点,在那里我可以返回req.user的JSON值,但是无论如何,req.user都被返回为undefined,尽管它在get('*')下运行良好。这是我所做的GET调用,返回undefined:
server.get('/user', (req, res) => {
  console.info('user: ', req.user);
});

server.get('*', async (req, res, next) => {
  console.info('*: ', req.user);
  // ... the rest of the React Starter Kit rendering code

req.user 应该返回一个对象,但实际上没有返回,这让我感到困惑。是护照会话仅限于特定的URL或其他限制吗?

中间件:

    server.use(express.static(path.join(__dirname, 'public')));
    server.use(cookieParser());
    server.use(session({
      secret: 'keyboard cat',
      cookie: { httpOnly: false },
      resave: true,
      saveUninitialized: true,
    }));

    server.use(passport.initialize());
    server.use(passport.session());

序列化/反序列化是最简单的操作:

    passport.serializeUser((user, done) => {
      console.log('serializeUser');
      done(null, user);
    });

    passport.deserializeUser((obj, done) => {
      console.log('deserializeUser');
      done(null, obj);
    });

我知道有类似的SO主题关于req.user未定义,但是没有一个似乎像我的情况,它只在请求位置不同时才被定义。

感谢您的阅读和任何建议。干杯!


编辑: 这是认证流程:

    [initial app load with fresh server instance...]
    in (*) passport FALSE
    indexPage mounting...
    in (/user) passport FALSE
    [click login button and successfully login]
    serializeUser
    deserializeUser
    in (*) passport is TRUE
    indexPage mounting...
    in (/user) passport FALSE

我进行了进一步的测试,并发现当使用Chrome控制台触发API调用时有趣的事情发生了。顺便说一下,我使用fetch来实现这一点 - 我执行 fetch('/user') 然后在 componentDidMount 方法中记录响应。现在,当我在Chrome控制台中这样做: fetch(/*) ,终端控制台再次记录了in (*) passport is false

所以问题似乎是护照在初始渲染后完全消失了。也许是cookie的问题?我将进一步调查并看看我能找到什么。

你可以尝试打印req.session.passport.user的值吗? - Michael Parker
嘿@MichaelParker,感谢您的评论!所以我在我的两个req.user日志下注销了req.session.passport.user,当尝试在get('*')中登录时,应用程序挂起,在get('/user')中,req.passport未定义,因此错误Cannot read property 'user' of undefined记录并导致应用程序崩溃。我想这对于解决问题很有帮助- passport不可用,您有什么想法是为什么? - sherlock
我不确定。从你目前发布的内容中,我只能看到可能会导致一些问题的是你的serializeUserdeserializeUser函数,但我不认为它会导致你在评论中提到的问题。如果你不介意将你的代码放在某种公共存储库中,我可以尝试自己搭建并查看你没有在这里发布的代码是否有问题。 - Michael Parker
啊,糟糕,那其实是我的错 - 它是未定义的,因为我没有登录。它实际上在 get('*') 块中返回,并且我已经使用一些更多的信息更新了主帖子。看起来问题是护照的会话在初始呈现后出现了某些原因的消失。 - sherlock
1个回答

7
使用fetch()时,与XMLHttpRequest()类似,您需要明确告诉浏览器任何凭据(例如会话cookie,Passport需要这些凭据才能识别活动会话)需要随请求一起发送:
fetch('/user', { credentials : 'same-origin' }).then(...);

您可以使用的各种值在此处有记录。

这解决了我的问题。谢谢,先生。 - sherlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接