在令牌验证的上下文中正确使用 async/await



我正在为一个使用谷歌登录验证用户的网站构建一个 Express.js 后端。

而且,我正在尝试创建一个 RESTful API 调用,它:

  1. 接收 ID 令牌。
  2. 使用 Google 的 OAuth2 库验证该令牌。
  3. 检查用户是否在 MongoDB 集合中,然后:
  4. 如果为 true,则发回访问令牌,如果为 false,则不返回任何内容。

这就是我到目前为止所拥有的...

发布请求:

//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(( 是一个异步函数,我需要让它在将其分配给变量之前解决其承诺,但我不知道如何正确做到这一点,不幸的是,我无法将 verify(( 变成同步函数,因为这样它就不会在从 Google 的库中调用 getPayload(( 之前正确创建票证对象。

关于如何使所有这些以正确的顺序发生的任何想法?

谢谢。

你能试试:

//recieve token id from frontend, verify it, and send session back in response
router.post('/google', async (req, res) => {
const idToken = req.body.tokenID;
const accessToken = req.body.accessToken;
const client = new OAuth2Client(keys.google.clientID);
const session = await verify(idToken, accessToken, client).catch(console.error);
console.log('Session: ', session)
return res.send(session);
});

更新- 查找用户:

//find user
async function findUser(email) {
const user = await 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;
}
});
return user;
}

最新更新