#node.js #mongodb #authentication
#node.js #mongodb #аутентификация
Вопрос:
У меня есть приложение для блогов Express и Mongo. Я реализовал аутентификацию Google, но я не знаю, как сохранить идентификатор пользователя вместе с сообщением, которое создает пользователь.
Это настройки Google:
const {OAuth2Client} = require('google-auth-library');
const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
const googleVerify = async( idToken = '' ) => {
const ticket = await client.verifyIdToken({
idToken,
audience: process.env.GOOGLE_CLIENT_ID
});
const { name,
picture: img,
email,
sub: id
} = ticket.getPayload();
return { name, img, email, id };
}
const googleSignIn = async(req, res = response) => {
try {
let googleUser = await googleVerify(req.body.id_token);
console.log(googleUser);
// console.log(googleUser);
} catch (error) {
res.status(400).json({
msg: 'Token de google no valido'
})
}
}
И это маршрут публикации статьи:
router.post('/', upload.single('image'), async (req, res) => {
let body = req.body;
const article = new Article({
title: body.title,
description: body.description,
markdown: body.markdown,
img: req.file.filename
});
try {
await article.save();
} catch (error) {
console.log(error);
res.render('new', {article: article});
} finally {
res.redirect(`/articles/${article.id}`);
}
});
Как я могу получить доступ к зарегистрированному пользователю из этого маршрута статьи?
Спасибо!!
Ответ №1:
Один из способов получить вашего зарегистрированного пользователя из вашего маршрута экспресс-почты — вызвать вашу googleVerify()
функцию из маршрута следующим образом
router.post('/', upload.single('image'), async (req, res) => {
...
const googleUser = await googleVerify(req.body.id_token);
// Do stuff with your googleUser here
...
});
Вышесказанное должно работать просто отлично, при условии, что клиент отправляет id_token
запрос во время post, и если ваша googleVerify()
функция определена в другом файле, вам может потребоваться экспортировать и импортировать ее здесь для использования.
Другим способом было бы использовать googleSignIn
функцию в качестве промежуточного программного обеспечения
router.post('/', googleSignIn, upload.single('image'), async (req, res) => {
...
let body = req.body;
// you should have access to googleUser like this
// body.googleUser
...
});
Затем реорганизуйте свою googleSignIn
функцию, чтобы использовать такую next
функцию
const googleSignIn = async(req, res, next) => {
try {
let googleUser = await googleVerify(req.body.id_token);
console.log(googleUser);
req.body.googleUser = googleUser; // set user to the request body
next(); // Moves to next middleware
} catch (error) {
res.status(400).json({
msg: 'Token de google no valido'
})
}
}
Комментарии:
1. Спасибо за ваш ответ! Я пытался сделать это обоими способами, но я не знаю, почему я получаю ошибку недопустимого токена.
2. Это потому, что ваш клиент не отправляет
id_token
. Попробуйте передатьid_token
в теле, когда вы делаете запрос на публикацию статьи.