Javascript 反应前端+;Express.js会话

Javascript 反应前端+;Express.js会话,javascript,reactjs,express,session,cookies,Javascript,Reactjs,Express,Session,Cookies,我有基于Express.js的后端API和基于React Redux的客户端 通过Express.js会话对我的API进行身份验证。用户通过Passport(OAuth2)登录,然后将用户的cookie保存到与其用户id连接的数据库中。此cookie也位于客户端浏览器的cookie存储中 若您向该API发送下一个请求,服务器将用数据库检查您的cookie,若其正确,它将回答您的数据 当我不使用React时,它工作得很好,但现在客户端必须在您发出请求之前(当React应用程序加载时)就知道用户已经

我有基于Express.js的后端API和基于React Redux的客户端

通过Express.js会话对我的API进行身份验证。用户通过Passport(OAuth2)登录,然后将用户的cookie保存到与其用户id连接的数据库中。此cookie也位于客户端浏览器的cookie存储中

若您向该API发送下一个请求,服务器将用数据库检查您的cookie,若其正确,它将回答您的数据

当我不使用React时,它工作得很好,但现在客户端必须在您发出请求之前(当React应用程序加载时)就知道用户已经登录了

即使用户未登录,会话cookie也会保存,因此我会丢失

怎么做

关于其工作原理的图像:

其他研究:


例如,我正在调查。。。他们正在使用会话cookie。。。若我删除了这个cookie,那个么用户就被注销了,而且当我在Postman中使用这个cookie时,我可以获取API。但我找不到任何关于检查用户是否已登录的请求。React应用程序在收到服务器的初始数据后立即知道它。也许他们把这些信息从服务器上推到了React中?不是在加载应用程序后调用APi吗?

我解决这个问题的方法与Andy Taton在回答中所表达的方法相同。事情是这样的:

客户端:

componentDidMount() {
    api('/profile').get().then(data => {
        console.log('/profile data', data)
    })
}
服务器端:

  app.get('/profile', (req, res) => {
    if (req.user) {
      db.Favorite.find({ uid: req.user._id }).then(user => {
        return res.status(200).json(user)
      })
    } else {
      return res.status(403).json({ message: 'you are not logged in' })
    }
  })
您的请求必须包含凭据:如果使用ES6 fetch,则“包括”;如果使用axios,则请求必须包含凭据:true

检查,它包含一个Twitter身份验证的工作示例。
希望有帮助

这是我解决这个问题的办法

由于前端不知道用户,但后端可以通过cookie和passport创建的属性request.user来判断用户是谁,因此我们必须询问后端用户是谁

在后端创建一个路由,比如api/user。它只是查找cookie并获取用户并将json发送回。如果没有用户,服务器会回复没有用户。也许我们可以在这里重定向到passport登录,但我只是在前端打开了window.open(/auth/github)


TLDR,前端不认识用户?询问后端。

没有22个人知道?从设计角度来看,你不能依靠客户端“知道”任何事情。客户端是互联网的丛林。他们会送你饼干。他们不会给你送饼干。他们会给你发送错误的cookies。您拥有的唯一控制权在服务器端。这意味着每个请求——对于React web内容,对于数据,对于任何内容——都必须在服务器端进行筛选以进行身份验证。因此,当您说,“客户端必须在您发出某些请求之前就知道用户已登录”——不,这不是它的工作方式。客户端无论如何都会发出请求。各种各样的要求。您的服务器的任务是以您想要的方式回答。@AndyTaton但我只需要在第一次从服务器加载React应用程序(启动浏览器)时,能够告诉inital React的状态,即用户已登录,以显示登录用户的UI,而不是未登录的用户的UI。@AndyTaton我知道客户端是哑的,我知道我需要处理每个请求,但我不知道如何判断用户在加载应用程序后何时登录