0

我正在尝试使用本教程实现谷歌身份验证:https ://blog.prototypr.io/how-to-build-google-login-into-a-react-app-and-node-express-api-821d049ee670

但是使用 Typescript 和 Promise 语法(这些是要求),我收到了这个错误: 在此处输入图像描述

这是代码:

import { HttpRequest, HttpResponse } from 'src/adapters/http';
import { OAuth2Client } from 'google-auth-library';
import { config } from './../../../config';

const client = new OAuth2Client(config.auth.google.id);

export const makeLoginUser = () => {
  return (httpRequest: HttpRequest, httpResponse: HttpResponse) => {
  new Promise(async (resolve, reject) => {
    const { tokenId } = httpRequest.body;
    console.log(tokenId);
    try {
      const ticket = await client.verifyIdToken({
        idToken: tokenId,
        audience: config.auth.google.id,
      });

      const { name, email, picture } = ticket.getPayload();

      resolve(httpResponse.status(200).send(email));
    } catch (error) {
      reject(httpResponse.status(429).send('Invalid request'));
    }
  });
};

};

4

1 回答 1

2

我有同样的错误并像这样解决它:

import { Request, Response } from 'express'
import { OAuth2Client } from 'google-auth-library';
import UserModel from './../models/user';
var jwt = require('jsonwebtoken')

// @desc    Login with google
// @route   POST /api/user/google-login
// @access  Public

const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID)
export const signInWithGoogle = async (req: Request, res: Response) => {
  const { idToken } = req.body
  const ticket = await client.verifyIdToken({
    idToken,
    audience: process.env.GOOGLE_CLIENT_ID
  }).then((response) => {
    if (response.getPayload() && response.getPayload()?.email_verified) {
      const email = response.getPayload()?.email
      const name = response.getPayload()?.name
      
      UserModel.findOne({ email }).exec((err, user) => {
        if (user) {
          const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, {
            expiresIn: "7d",
          })
          const { _id, email, name, role } = user
          return res.json({
            _id,
            name,
            email,
            role,
            token
          })
        } else {
          const password = `${email}${process.env.JWT_SECRET}`
          user = new UserModel({ name, email, password });
          user.save((err, data) => {
            if (err) {
              console.log("ERROR GOOGLE LOGIN ON USER SAVE", err)
              return res.status(400).json({
                error: "Google Login Failed"
              })
            }
            const token = jwt.sign(
              { _id: data._id },
              process.env.JWT_SECRET,
              {
                expiresIn: "7d"
              }
            )
            const { _id, email, name, role } = data
            return res.json({
              _id,
              name,
              email,
              role,
              token
            })
          })
        }
      })
    }
  })
}

于 2021-06-07T07:00:30.937 回答