我正在使用React Starter Kit制作一个应用程序,使用Passport进行身份验证。我现在正处于尝试在前端访问req.user对象的阶段,但我无法将该req.user对象传递到React/ES6环境中。我尝试将对象作为prop和context传递,但都没有成功。因此,我决定创建一个API端点,在那里我可以返回req.user的JSON值,但是无论如何,req.user都被返回为undefined,尽管它在get('*')下运行良好。这是我所做的GET调用,返回undefined:
我进行了进一步的测试,并发现当使用Chrome控制台触发API调用时有趣的事情发生了。顺便说一下,我使用
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 Parkerreq.user
日志下注销了req.session.passport.user
,当尝试在get('*')
中登录时,应用程序挂起,在get('/user')
中,req.passport
未定义,因此错误Cannot read property 'user' of undefined
记录并导致应用程序崩溃。我想这对于解决问题很有帮助- passport不可用,您有什么想法是为什么? - sherlockserializeUser
和deserializeUser
函数,但我不认为它会导致你在评论中提到的问题。如果你不介意将你的代码放在某种公共存储库中,我可以尝试自己搭建并查看你没有在这里发布的代码是否有问题。 - Michael Parkerget('*')
块中返回,并且我已经使用一些更多的信息更新了主帖子。看起来问题是护照的会话在初始呈现后出现了某些原因的消失。 - sherlock