【发布时间】:2020-04-03 21:07:13
【问题描述】:
我正在为使用 Google 登录验证用户的网站构建 Express.js 后端。
而且,我正在尝试创建一个 RESTful API 调用:
- 接受一个 IDtoken。
- 使用 Google 的 OAuth2 库验证该令牌。
- 检查用户是否在 MongoDB 集合中,然后:
- 如果为真则返回访问令牌,如果为假则不返回任何内容。
这就是我目前所拥有的......
发帖请求:
//recieve token id from frontend, verify it, and send session back in response
router.post('/google', (req, res) => {
const idToken = req.body.tokenID;
const accessToken = req.body.accessToken;
const client = new OAuth2Client(keys.google.clientID);
const session = verify(idToken, accessToken, client).catch(console.error);
console.log('Session: ', session)
return res.send(session);
});
验证():
//verify token
async function verify(idToken, accessToken, client) {
const ticket = await client.verifyIdToken({
idToken: idToken,
audience: keys.google.clientID,
});
const payload = ticket.getPayload();
const email = payload['email'];
if (findUser(email)) {
return {
email: email,
accessToken: accessToken
};
} else {
return null;
}
}
查找用户():
//find user
function findUser(email) {
User.find({email: email}, (error, user) => {
if(error) {
console.log(error);
return false;
} else if (user.length === 0) {
console.log('this user is not in the database');
return false;
} else {
console.log('this user is in the database');
return true;
}
});
}
对于输出,无论用户是否在数据库中,我总是得到:
Session: Promise { <pending> }
this user is in the database
或
Session: Promise { <pending> }
this user is not in the database
我知道,因为 verify() 是一个异步函数,我需要在将它分配给变量之前让它解决它的承诺,但我不知道如何正确地做到这一点,不幸的是,我不能t 使 verify() 成为同步函数,因为它在从 Google 库调用 getPayload() 之前没有正确创建票证对象。
关于如何以正确的顺序完成这一切的任何想法?
谢谢。
【问题讨论】:
标签: javascript node.js express async-await google-signin