在React(ES6)中访问Passport的req.user?API调用将req.user返回为undefined

she*_*ock 2 javascript node.js express reactjs passport.js

我正在使用使用Passport进行身份验证的React Starter Kit制作应用程序.我正处于现阶段,我正在尝试访问前端的req.user对象,但是我无法将该req.user对象传递到React/ES6环境中.

我试图将对象作为a prop和as 传递context,但无济于事.此时,我决定创建一个API端点,我可以将req.user的值作为JSON req.user返回undefined,但是尽管它正常工作,但仍然返回get('*').

这是我做的GET调用,即返回undefined:

server.get('/user', (req, res) => {
  console.info('user: ', req.user);
});
Run Code Online (Sandbox Code Playgroud)

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

确实会返回一个对象req.user,这让我感到困惑.护照会议是否仅限于某些网址或其他内容?

中间件:

    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());
Run Code Online (Sandbox Code Playgroud)

序列化/反序列化就像它们得到的一样简单:

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

    passport.deserializeUser((obj, done) => {
      console.log('deserializeUser');
      done(null, obj);
    });
Run Code Online (Sandbox Code Playgroud)

我知道有类似的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
Run Code Online (Sandbox Code Playgroud)

我做了一些进一步的测试,并在使用Chrome控制台触发API调用时发现了一些有趣的内容.我正在使用fetch这样做 - fetch('/user')然后我在componentDidMount方法中记录响应.现在,当我在Chrome控制台中执行此操作时:fetch(/*)终端控制台in (*) passport is false再次登录.

所以问题似乎是护照在初始渲染后完全消失了.Cookie可能存在问题吗?我将进一步调查,看看我能找到什么.

rob*_*lep 6

使用时fetch(),就像使用一样XMLHttpRequest(),您需要明确告诉浏览器,任何凭据(如会话cookie,Passport需要哪些以识别活动会话)都需要与请求一起发送:

fetch('/user', { credentials : 'same-origin' }).then(...);
Run Code Online (Sandbox Code Playgroud)

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