Passport 从 successRedirect 获取用户

Passport get user from successRedirect

我是 node express 的新手。在使用 Passport-facebook 进行身份验证后,我只想 return 向用户 User 对象。我尝试查看一些示例项目,我可以看到它们以某种方式从 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!" })
}

我花了几个小时调试这个。我觉得我浪费了一些时间,但我终于让它工作了。显然在重定向时,上下文或数据被删除。所以我不得不在控制器中重写护照的重定向,如下所示:

// 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 正确获取数据了。