Passport.JS - 没有会话授权?

时间:2017-01-08 19:50:30

标签: node.js authentication authorization passport.js

如果没有使用会话,如何使用授权(绑定到现有帐户)?在授权响应从facebook返回后,我找不到知道哪个用户想要授权的方法。没有会话就不可能告诉...令牌不再出现在请求中(用户都不会)。通常他们会从会话中获取该信息。尝试继续本地存储但它不会起作用,因为护照会产生几个内部回调,我无法绑定到当前上下文。

http://passportjs.org/docs/authorize

1 个答案:

答案 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

希望这可以帮到你。