在令牌验证的上下文中正确使用 async/await
Using async/await correctly in the context of token validation
我正在为使用 Google 登录验证用户的网站构建 Express.js 后端。
而且,我正在尝试创建一个 RESTful API 调用,其中:
- 接收 IDtoken。
- 使用 Google 的 OAuth2 库验证该令牌。
- 检查用户是否在 MongoDB 集合中,然后:
- 如果为真,则发回访问令牌;如果为假,则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;
}
我正在为使用 Google 登录验证用户的网站构建 Express.js 后端。
而且,我正在尝试创建一个 RESTful API 调用,其中:
- 接收 IDtoken。
- 使用 Google 的 OAuth2 库验证该令牌。
- 检查用户是否在 MongoDB 集合中,然后:
- 如果为真,则发回访问令牌;如果为假,则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;
}