Как я могу связать пользователя Google с документом в моей коллекции?

#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 в теле, когда вы делаете запрос на публикацию статьи.