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

Using async/await correctly in the context of token validation

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

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

  1. 接收 IDtoken。
  2. 使用 Google 的 OAuth2 库验证该令牌。
  3. 检查用户是否在 MongoDB 集合中,然后:
  4. 如果为真,则发回访问令牌;如果为假,则returns什么都不发。

这是我目前所拥有的...

post请求:

//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;
}