我正在使用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?是否有更好的方法来做同样的事情?