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