反应app表达js为用户建立会话的正确方法

时间:2018-03-14 18:44:19

标签: javascript reactjs session cookies google-oauth2

我正在使用node / express / mongodb后端创建react应用程序。我尝试将passport.js与Google策略一起使用,但我不想被重定向。我找到了另一种授权用户的方式。

在我的前端应用程序上:

npm install --save react-google-login

在代码中插入组件:

<GoogleLogin
              clientId="my google client id"
              buttonText="Login"
              onSuccess={this.props.responseGoogle}
              onFailure={this.props.responseGoogle}
            />

创建回调函数:

responseGoogle(response) {
    const headers = {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
    axios.post('/api/v1/tokensignin', { tokenId: response.tokenId }, headers)
      .then((response) => {
        console.log(response);
      })
      .catch((error) => {
        console.log(error);
      });
  }

后端:

npm install body-parser

npm install --save cookie-session

npm install --save google-id-token-verifier

在后端接收发布请求:

app.post('/api/v1/tokensignin', (req, res) => {
    const tokenId = req.body.tokenId;
    const clientId = keys.googleClientID;
    verifier.verify(tokenId, clientId, (err, tokenInfo) => {
      if (!err && tokenInfo.aud === clientId) {
        User.findOne({ googleId: tokenInfo.sub }).then((existingUser) => {
          if (existingUser) {
            if (!req.session.user) {
              req.session.user_id = {};
            }
            req.session.user_id = existingUser.id;
          } else {
            new User({ googleId: tokenInfo.sub })
              .save()
              .then(user => { 
                if(!req.session.user) {
                  req.session.user_id = {};
                }
                req.session.user_id = user.id; 
              });
          }
          res.sendStatus(200);
        });

      } else {
        console.log('ERROR: ', err);
        res.status(500).send('TokenId not verified');
      }
    });
  });

在index.js中有中间件:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey]
  })
);

问题是这个已建立的用户会话是否受到保护?

我是否总能在后端的所有请求中访问req.session.user_id?是否有更好的方法来做同样的事情?

0 个答案:

没有答案