如果没有使用会话,如何使用授权(绑定到现有帐户)?在授权响应从facebook返回后,我找不到知道哪个用户想要授权的方法。没有会话就不可能告诉...令牌不再出现在请求中(用户都不会)。通常他们会从会话中获取该信息。尝试继续本地存储但它不会起作用,因为护照会产生几个内部回调,我无法绑定到当前上下文。
答案 0 :(得分:0)
如您所指定的,您正在使用Passport.JS和Facebook策略,您可以使用州字段。您需要创建2个中间件,一个在调用登录URI的身份验证之前使用,另一个在loginCallback URI之前使用。
请注意,您还需要更新策略以正确管理用户。记住,你不能使用'req.user,
我个人也不喜欢这些会话,但很常见的是找到有关如何使用auth的信息。
请检查此方法如何调用禁用会话的'authenticate'passport方法,并且也是中间件方式,您当然可以与router.get(...)联机,但我找到了它在我的应用程序中的一个好习惯我同时使用local,facebook和JWT auth,我喜欢有一致的模式。此外,如果您计划创建并保存令牌。如果您碰巧使用异步存储(例如mongoDB),则可能会遇到处理回调的麻烦。
根据您应该使用授权的文档如果您将使用该endopoint连接到本地帐户,但由于您根本没有会话,所以使用没有任何意义,从来没有我认为您应该有2条路径,一个用于注册Facebook,另一个用于计划将本地账户与facebook合并,如果传递给Facebook的令牌可以确定它是第一次还是连接)
不要忘记在两次身份验证呼叫中禁用会话。
function facebookTempTokenCreate(req, res, next) {
// create the token the way you think is best,
// I personally prefer to create a JWT and save it somewhere in the DB.
// also you need to pass it to the next middleware by saving the value
// in the req. name can be anything you want.
// but make sure is quite unique as you do not want to break other libraries.
req.facebookConnectToken = 'that_sweet_token';
next(); // dont forget to continue to next middleware.
}
function facebookAuthenticate(req, res, next) {
passport.authenticate('facebook', {
scope : 'email',
callbackURL : 'your_app_callback_uri',
state : req.facebookConnectToken,
session : false
})(req,res,next);
}
function facebookAuthenticateCallback(req, res, next) {
passport.authenticate('facebook', {
scope : 'email',
session : false
})(req,res,next);
}
function facebookTempTokenValidate(req, res, next) {
console.log('here we validate the token: ' + req.query.state );
next();//dont forget to pass execution to next middleware.
}
app.get('/facebook/login', facebookTempTokenCreate, facebookAuthenticate);
app.get('/facebook/login/callback', facebookTempTokenValidate, facebookAuthenticateCallback);
您可以在此链接中找到更多信息。 https://github.com/jaredhanson/passport-facebook/issues/14
希望这可以帮到你。