Passport从成功重定向中获取用户

问题描述 投票:0回答:1

我是node express的新手。我只是想把 User 鉴定后的对象 护照-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!" })
}
javascript node.js express passport.js
1个回答
0
投票

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

// 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.

© www.soinside.com 2019 - 2024. All rights reserved.