NodeJs:Passport Bearer + Api(google,fb,...)

时间:2015-02-06 11:12:32

标签: angularjs node.js facebook bearer-token

我正在使用NodeJs和PassportJs开发一个restful api进行身份验证。 为了避免会话,(无状态),我使用持票令牌(passport-http-bearer)来验证用户(客户端:AngularJs)。

但是,当我想将Facebook帐户与谷歌帐户链接时,我有一个问题。 创建不同的帐户很容易但是将它们链接到一个用户,我不知道如何继续(我认为这种方法是通过远程API传播令牌)。

这是我的护照策略代码:

passport.use('bearer-login', new BearerStrategy({ passReqToCallback: true },
    function(req, token, done) {
        process.nextTick(function() {
            jwt.verify(token, parameters.secret, function(err, decodedToken){
                if(err) return done(err);
                User.findOne({
                    _id: decodedToken.userid,
                    usernameCanonical: decodedToken.username
                }, function(err, user) {
                    if (err) return done(err);
                    if (!user) return done(null, false);
                    return done(null, user, {
                        scope: 'all'
                    });
                });
            })
        });
    }
));

passport.use('github-login', new GithubStrategy({
    clientID: parameters.github.clientId,
    clientSecret: parameters.github.clientSecret,
    callbackURL: parameters.github.callback,
    passReqToCallback: true
  },
  function(req,accessToken, refreshToken, profile, done) {
    User.findOne({ 'github.id': profile.id }, function (err, user) {
        if(err) return done(err);
        if(!user){
            var user = new User({'github.id':profile.id, 'github.token':accessToken, 'github.name': profile.name});
            user.save(function(err){
                if(err) return done(err);
                return done(null, user);
            })
        } else {
            if(!user.github.token) {
                user.github.token = accessToken;
                user.save(function(err){
                    if(err) return done(err);
                    return done(null, user);
                })
            } else return done(null, user);
        } 
    });
  }
));

在这里我的身份验证路线:

router.route('/auth/github/login').get(passport.authenticate('github-login', {session: false}));

router.route('/auth/github/callback')
    .get(passport.authenticate('github-login', { session: false, failureRedirect: 'http://localhost:8080/login' }), 
        function(req, res, next){

            var token = jwt.sign({
                userid: req.user._id,
                username: req.user.usernameCanonical
            }, parameters.secret);

            res.writeHead(302, {
            'Location': 'http://localhost:8080/categories?token=' + token
            });
            return res.end();

        });



router.route('/auth/current')
    .get(passport.authenticate('bearer-login', {session: false}), function(req, res){
        return res.send({username: req.user.username});
    });

你知道如何继续吗?

谢谢。

0 个答案:

没有答案