Passport.js Auth 适用于 localhost 但不适用于 Heroku

时间:2021-07-24 11:37:53

标签: javascript node.js express heroku passport.js

我的后端有问题。在本地主机上一切正常,但上传到 Heroku 授权后停止工作。

问题是两个脚本 passport-setup.jsauth-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 返回 undefined 并且数据无法传递到前端,因此无法在 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 }

0 个答案:

没有答案