#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)
который должен вернуться пользователь, но в этом случае возвращается неопределенный.