gpt4 book ai didi

node.js - passportjs facebook 将请求传递给回调

转载 作者:搜寻专家 更新时间:2023-10-31 23:39:00 24 4
gpt4 key购买 nike

我一定是忽略了这里的某些东西。我正在使用 passportjs 的 Facebook 策略来验证用户。这是通过 2 个请求/[路由处理程序]完成的:

//one to initiate the the auth:
init: function (req, res, next) {
passport.authenticate('facebook', {
callbackURL: URL + '/facebook/callback',
state: req.body //attempting to put some state
})(req, res, next)
}

//one callback
callback: function (req, res, next) {
passport.authenticate('facebook', {
callbackURL: URL + '/facebook/callback'
},
function (err, profile, accessToken, refreshToken) {
if (err) return next(err)
res.send(passedReqBody)
})(req, res, next)
}

//the verify callback doesn't do much.
//Application logic is done in route callback handlers
passport.use(new FacebookStrategy({
clientID: config.facebook.id,
clientSecret: config.facebook.secret
},
//When setting passReqToCallback to true, it is set as the first argument
//to the verify callback. As in:
//function (req, accessToken, refreshToken, params, profile, done) {
//But this is the 'callback' request object. I want the 'init' request object.
function (accessToken, refreshToken, params, profile, done) {
//params.state is undefined
return done(null, profile, accessToken, refreshToken);
}));

我的问题是我希望在回调路由处理程序中公开第一个函数的 POST 请求主体。

OAuth2Strategy 构造函数“passReqToCallback”有一个选项可用,它将最新请求发送回验证回调,这对我没有用(我想要第一个 request.body)

下一个看似合理的路径是使用 'state' 选项,如 https://github.com/jaredhanson/passport-oauth/blob/master/lib/passport-oauth/strategies/oauth2.js#L169

但是这些值在 getOAuthAccessToken 回调中不可用 https://github.com/jaredhanson/passport-oauth/blob/master/lib/passport-oauth/strategies/oauth2.js#L124

我当前的选择是在 OAuth2Strategy.prototype.authenticate() 函数中添加一个额外的变量,该变量在第一个函数上设置,并原封不动地传回回调函数,但我无法想象这是要走的路。

最佳答案

根据您的描述,最佳方法可能取决于您的应用程序,但这里是对您的 initcallback 中间件的快速修改:

init: function (req, res, next) {
// SAVE BODY IN SESSION
req.session.initBody = req.body;

passport.authenticate('facebook', {
callbackURL: URL + '/facebook/callback',
state: req.body //attempting to put some state
})(req, res, next)
}

//one callback
callback: function (req, res, next) {
passport.authenticate('facebook', {
callbackURL: URL + '/facebook/callback'
},
function (err, profile, accessToken, refreshToken) {
if (err) return next(err)
// RESTORE BODY FROM SESSION
res.send(req.session.initBody);
delete req.session.initBody;
})(req, res, next)
}

请注意,原始请求正文被保存到 session 中,然后在回调时恢复。如果您希望数据在请求/响应周期中存活下来,这是一种可以做到这一点的技术。然而,我要提醒的是,在 GET 回调中改变状态可能是不可取的,所以如果你修改任何基于原始主体的东西要小心。

关于node.js - passportjs facebook 将请求传递给回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com