javascript - 使用 Node js 验证 Google ID token

标签 javascript node.js swift

我有一个 iOS 应用程序,它会向后端服务器发送一个谷歌 ID 进行验证。

我正在遵循 Google 指南: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 token 的最佳方法是使用下面 npm 中的 google-auth-library是用于验证从客户端发送到服务器的 tokenId 的示例片段,希望对您有所帮助。

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

});

关于javascript - 使用 Node js 验证 Google ID token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666691/

相关文章:

java - Vaadin:单击按钮后将文本字段中的文本设置为标签

javascript - Angular 副本无法让客户端保持最新状态

mysql - 错误:Cannot enqueue Query after invoking quit in MySQL with NodeJS

ios - 启用/禁用按钮,用于验证在文本字段中输入的电话号码

ios - 子类 UIView 不可见,但内容可见

swift - 使用来自另一个类的参数调用 viewcontroller 中的函数

javascript - 模态在顶部,我不能改变宽度

JavaScript 生成的 SVG 不渲染内容

node.js - NodeJS 终止错误的差异

json - Mongoose 返回空对象,在 mongo shell 中工作