使用Node js验证Google ID Token



我有一个iOS应用程序,它正在将谷歌id发送到后端服务器进行验证。

我遵循谷歌的指导方针:https://developers.google.com/identity/sign-in/web/backend-auth

我对Node.js还很陌生,我不明白为什么回调函数永远不会被执行(也就是说,promise既不解析也不拒绝(:

const verifyToken = new Promise(function(resolve, reject){
console.log("promise function")
client.verifyIdToken({
idToken: token,
audience: process.env.CLIENT_ID, 
function (e, login){
console.log(e)
if (login) {
var payload = login.getPayload();
var googleId = payload['sub'];
resolve(googleId);
} else {
reject("invalid token");
}
}
});
});
verifyToken.then((token) => {
console.log("RESOLVED");
jwt.sign({id: googleId}, 'secret key', { algorithm: 'RS256' }, (err, token) => {
console.log("sending data back");
res.send(token);
});
});
verifyToken.catch((message) => {
console.log("REJECTED");
res.send(message);
});

验证Google ID令牌的最佳方法是使用npm中的Google auth库。下面是验证从客户端发送到服务器的令牌ID的示例片段,希望它能有所帮助。

const {GOOGLE_CLIENT_ID, JWT_SECRET } = process.env;
app.post('/api/v1/auth/google', async ({ body: { tokenId } }, res) => {
const client = new OAuth2Client(GOOGLE_CLIENT_ID);
const ticket = await client.verifyIdToken({
idToken: tokenId,
audience: GOOGLE_CLIENT_ID,
});
const response = ticket.getPayload();
if (response.iss !== 'accounts.google.com' && response.aud !== GOOGLE_CLIENT_ID)
return res.status(400).json({ status: 'error', error: 'Bad Request' });
const user = {
email: response.email,
image: response.picture,
social_id: response.sub,
first_name: response.given_name,
last_name: response.family_name,
};
let result = await User.findOne({
where: { [Op.or]: [{ email: user.email }, { social_id: user.social_id }] },
});
if (!result) result = await User.create(user);
const token = await jwt.sign({ id: result.dataValues.id }, JWT_SECRET, { expiresIn: '1hr' });
const data = { token, ...result.dataValues};
res.status(200).json({ status: 'success', data });
});

创建新Promise时,它将自动执行。在executor中传递的resolve和reject函数将在调用时将promise的状态分别更改为resolve或rejected。看看这个链接

将为已解析和已拒绝的promise执行.then和.catch实现。因此,就promise的执行而言,您的代码看起来不错。

取决于控件是否到达您所写的块。正如我所看到的,在您的实现中,它必须位于某些(req,res(中间件内部。

所以,请检查该中间件是否正在执行。

最新更新