Паспорт получить пользователя от successRedirect - PullRequest
0 голосов
/ 03 мая 2020

Я новичок ie в узле express. Я просто хочу вернуть пользователю объект User после аутентификации с помощью Passport-facebook . Я попытался просмотреть некоторые примеры проектов и увидел, что они каким-то образом получают объект пользователя из successRedirect.

Но в моем случае я получаю undefined.

res.json({ message: "You are logged in!", user: req.user, info: req.info })

Весь мой код контроллера:

const express = require("express")
const router = express.Router()
const passport = require("passport")
const strategy = require("passport-facebook")
const util = require("util")

const db = require("../../models")
const userModel = require("../../models/user")
const User = userModel(db.sequelize, db.Sequelize)
const Op = db.Sequelize.Op

const FacebookStrategy = strategy.Strategy;

passport.serializeUser(function(user, done) {
  done(null, user)
})

passport.deserializeUser(function(obj, done) {
  done(null, obj)
})

// TODO: - Provide LIVE FB details in `.env`.
const strat = {
  clientID: process.env.DEV_FACEBOOK_CLIENT_ID,
  clientSecret: process.env.DEV_FACEBOOK_CLIENT_SECRET,
  callbackURL: process.env.DEV_FACEBOOK_CALLBACK_URL,
  profileFields: ["email", "name"]
}

passport.use(
  new FacebookStrategy(strat, (accessToken, refreshToken, profile, done) => {
    const { id, email, first_name, last_name } = profile._json

    // We're using fbid as "id".
    const newUser = {
      id: id,
      email: email,
      first_name: first_name,
      last_name: last_name
    }

    User.findByPk(id).then(data => {
      if (data) {
        console.log("Got data! ✅")
        done(null, data)
      } else {
        User.create(newUser).then(data => {
          console.log("Created new user! ✅")
          done(null, data)
        })
      }
    }).catch(err => {
      done(err, null)
    })
  })
)

// Begin loggin in via Facebook
exports.loginViaFacebook = passport.authenticate("facebook")
// Callback
exports.callback = passport.authenticate("facebook", {
  session: false,
  successRedirect: "/api/auth/success",    
  failureRedirect: "/api/auth/failure"
})
// Success
exports.success = (req, res, next) => {
  console.log("Success! ✅")
  res.json({ message: "You are logged in!", user: req.user, info: req.info })
}
// Failure
exports.failure = (req, res, next) => {
  res.json({ message: "Authentication failed!" })
}

1 Ответ

0 голосов
/ 03 мая 2020

Я потратил пару часов на отладку этого. Я чувствую, что потратил немного времени, но наконец-то все заработало. Очевидно, при перенаправлении контекст или данные удаляются. Поэтому мне пришлось переписать мои перенаправления паспорта в моем контроллере, например так:

// Begin loggin in via Facebook
exports.loginViaFacebook = passport.authenticate("facebook", { scope: "email" })
exports.callbackMiddleware = passport.authenticate("facebook", { failureRedirect: "/api/auth/failure" })
exports.callback = (req, res, next) => {
  console.log("Success! ✅ Is authenticated? " + req.isAuthenticated())
  res.json ({ message: "You are logged in!", user: req.user })
}

и мой маршрутизатор:

  // GET: Login via Facebook
  router.get("/facebook", controller.loginViaFacebook)
  // GET: Callback
  router.get("/facebook/callback", controller.callbackMiddleware, controller.callback)
  // GET: Failure
  router.get("/failure", controller.failure)

Теперь я могу правильно получить данные из req.user .

...