javascript - 使用 Typescript 和 Promise 语法的 Node.js 的 Google Auth
问题描述
我正在尝试使用本教程实现谷歌身份验证: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'));
}
});
};
};
解决方案
我有同样的错误并像这样解决它:
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
})
})
}
})
}
})
}
推荐阅读
- rabbitmq - 队列的 Rabbitmq msg_store_transient 正在消耗所有磁盘空间
- php - 如何使用 AJAX 将来自 mysql 的数据显示到文本字段中
- javascript - 用于嵌套形式的 Ruby 动作电缆
- html - 导航栏没有折叠 Boostrap
- javascript - 使用表单 POST 重定向到 .aspx 外部链接 url,来自 Angular 8/10 在 iPhone(Safari 浏览器)中不起作用
- swiperefreshlayout - 使用 Get Firebase 数据滑动刷新布局
- javascript - 有什么办法可以防止 Electron 中 Escape 键的默认操作?
- python-3.x - 按字段过滤 django 模型并包含具有空字段的数据
- python - 为什么单击按钮几次后我的滚动条没有出现?
- docker - 无法将用户添加到 InfluxDb 2.0 GUI/Docker