Passport.js Аутентификация работает на локальном хосте, но не на Heroku

#javascript #node.js #express #heroku #passport.js

Вопрос:

У меня проблема с моим бэкендом. На локальном хостинге все работало нормально, но после загрузки на Heroku авторизация перестала работать.

Проблема, судя по тому, как это выглядит, заключается в недопонимании между двумя сценариями passport-setup.js и auth-routes.js .

passport-setup.js извлекает информацию о пользователе из внешней базы данных. Эти данные правильно получены в этом скрипте, здесь.

 const passport = require('passport')
const { Strategy } = require('passport-twitter')
const keys = require('./keys')
const User = require('../models/user-model')

passport.serializeUser((user, done) => {
    done(null, user.id)
})

passport.deserializeUser((id, done) => {
    User.findById(id)
        .then(user => done(null, user))
        .catch(e => done(new Error('Failed to deserialize an user')))
})

passport.use(
    new Strategy(
        {
            consumerKey: keys.TWITTER_CONSUMER_KEY,
            consumerSecret: keys.TWITTER_CONSUMER_SECRET,
            callbackURL: '/auth/twitter/redirect',
        },
        async (token, tokenSecret, profile, done) => {
            const currentUser = await User.findOne({
                twitterId: profile._json.id_str,
            })

            if (!currentUser) {
                const newUser = await new User({
                    name: profile._json.name,
                    screenName: profile._json.screen_name,
                    twitterId: profile._json.id_str,
                    profileImageUrl: profile._json.profile_image_url,
                    token: token,
                    tokenSecret: tokenSecret,
                }).save()
                if (newUser) {
                    done(null, newUser)
                }
            }

            done(null, currentUser)
        }
    )
)
 

Но тогда он не может быть получен в auth-routes.js скрипте, так как req.user в этом случае возвращает неопределенное значение, и данные не могут быть переданы интерфейсу.

 const router = require('express').Router()
const passport = require('passport')
const fs = require('fs')
const MAIN_PAGE_URL = 'https://test.netlify.app'
const CLIENT_HOME_PAGE_URL = MAIN_PAGE_URL   '/createList'

router.get('/login/success', (req, res) => {
    console.log(req.user, req.cookies)

    if (req.user) {
        const slots = JSON.parse(fs.readFileSync('./config/config.json')).slots

        console.log(slots)

        res.json({
            success: true,
            message: 'user has succesfully authenticated',
            user: req.user,
            slots: slots,
            cookies: req.cookies,
        })
    }
})

router.get('/login/failed', (req, res) => {
    res.status(401).json({
        success: false,
        message: 'user failed to authenticate',
    })
    //res.redirect(MAIN_PAGE_URL)
})

router.get('/logout', (req, res) => {
    req.logout()
    res.redirect(MAIN_PAGE_URL)
})

router.get('/twitter', passport.authenticate('twitter'))

router.get(
    '/twitter/redirect',
    passport.authenticate('twitter', {
        successRedirect: CLIENT_HOME_PAGE_URL,
        failureRedirect: '/auth/login/failed',
    })
)

module.exports = { router, MAIN_PAGE_URL }
 

Комментарии:

1. Я не вижу, где ваш пользователь помещается в запрос на вход в систему.

2. router.get('/twitter', passport.authenticate('twitter')) Оттуда пользователь перенаправляется на страницу входа в Twitter. Когда он завершен, пользователь перенаправляется на /createList страницу, которая отправляет запрос (от интерфейса к бэкенду), на router.get('/login/success', (req, res) который должен вернуться пользователь, но в этом случае возвращается неопределенный.