使用Passport Consumer策略设置全局会话

时间:2017-04-17 15:01:38

标签: node.js session express authentication passport.js

我需要一些帮助来设置Passport Consumer Strategy并将其集成到" locals" (现在,我们的本地战略运作得很好)。我们已经尝试了几种方法,但没有运气,它100%工作。下面的代码不是完整的代码,我们已经拿出了一些代码,所以这篇文章不会太长。对此有任何帮助将非常感激。如果有人能让我们超越这个障碍,也可以得到补偿。

所以有一个问题是,如果用户通过消费者密钥和密钥进行身份验证,Passport如何存储会话变量,以便在整个站点中使用它们?

第二个问题,我们如何在通过身份验证过程后处理用户?

  1. 本地人和消费者都需要工作。
  2. 提供商使用POST的消费者密钥和密码< - 如果需要,我可以显示一些帖子。
  3. 这只需要OAuth1,截至目前,OAuth2不是一个选项。
  4. 这是针对单点登录身份验证的。
  5. 如果需要,我可以提供消费者会话输出。
  6. 最终,我们希望当地的战略和消费者战略与同样的"当地人和#34;全局变量。据我所知,我们可以对消费者进行身份验证,从我们的数据库中检索用户,创建一个会话,并告诉用户是否"确认已经过验证"。

    以下是我们现在的工作。

    本地策略正确验证。

    我们使用这些局部变量渲染页面: "省略了大部分代码以节省时间。"

    //=================================================================
    // The Authentication Module will bind to POST /login route
    //=================================================================
    authentication.initLocalStrategyRoutes(app);
    passport.authenticate('local', {successReturnToOrRedirect: '/', failureRedirect: '/login'});
    
    ...
    function renderPage(req, res, pageName, pageTitle){
    res.render(pageName, {
    pageName: pageTitle,
    username: req.user ? req.user.username : '',
    ...
    

    消费者策略通过来自"提供商"

    的POST请求进行身份验证

    我们已尝试将消费者策略添加到身份验证中。

    server.js

    //=================================================================
    // The Authentication Module will bind to POST /login route
    //=================================================================
    authentication.initLocalStrategyRoutes(app);
    ADDED -> authentication.initConsumerStrategyRoutes(app);
    passport.authenticate('local', {successReturnToOrRedirect: '/', failureRedirect: '/login'});
     ADDED -> passport.authenticate('consumer', {successReturnToOrRedirect: '/', failureRedirect: '/login'});
    

    authentication.js(省略代码)

    module.exports = function(siteConfig, defaultRedirectPage, server, sessionStore, log) {
    var passport = require('passport')
    

    ...

        , ConsumerStrategy = require('passport-http-oauth').ConsumerStrategy
        , TokenStrategy = require('passport-http-oauth').TokenStrategy
        , LocalStrategy = require('passport-local').Strategy;
    
        var auth = {};
        var authenticationRedirects = { successRedirect: '/', failureRedirect: '/login' };
    
    passport.serializeUser(function(user, done) {done(null, user);});
    passport.deserializeUser(function(obj, done) {done(null, obj);});
    auth.authenticate = function(email, password, callback) {
        email = email.toLowerCase();
        userController.findUserByUsernameWithPermissions(email,
            function(err, user) {
                if (err) return callback(err);
                if (!user) return callback(null, null, 'Incorrect username.');
            bcrypt.compare(password, user.password_hash, function(err, res) {
                if(err){return callback(err);
                } else if (!res) {return callback(null, null, 'Incorrect password.');
                } else {if (user.account_state>0) {callback(null, user);} else {return callback(null, null, '/reset?rand='+user._id);}}
                });
        }
    );
    }
    auth.initLocalStrategyRoutes = function(app){
        passport.use(new LocalStrategy(auth.authenticate));
        app.post('/login', function(req, res, next) {
            passport.authenticate('local', function(err, user, info) {
                if (err) return next(err);
                if (!user) return res.send({success: false, message: info});
                req.logIn(user, function(err) {
                    if (err) { return next(err); }
                    res.send(req.user);
                });
            }) (req, res, next);
        });
    }
    auth.initConsumerStrategyRoutes = function(app){
        // passport.use(new LocalStrategy(auth.authenticate));
        console.log('app: ', app)
        passport.use('consumer', new ConsumerStrategy(
          function(key, done) { console.log('starting ConsumerStrategy');
    
            dbConsumerKey.findByConsumerKey({consumerKey: key}, function(err, consumerKey) {
              if (err) { return done(err); }
    
              if (!consumerKey) {
                var errCode = dbError.find({name:'no_resource_link_id'}, function(err, errorCodes) {
                  console.log('statusText: ', errorCodes[0]["statusText"]);
                  return errorCodes[0]["statusText"];
                });
                return done(null, errCode);
              } else {
                if (!consumerKey[0]["consumerKey"]) { return done(err); }
                if (!consumerKey[0]["consumerSecret"]) { return done(err); }
                // return done(null, consumerKey[0]["consumerKey"], consumerKey[0]["consumerSecret"]);
                return done(null, consumerKey[0], consumerKey[0]["consumerSecret"]);
              }
    
            });
          },
          function(requestToken, done) {
            dbRequestTokens.find(requestToken, function(err, token) {
                    console.log('inside requestToken');
              if (err) { return done(err); }
              var info = { verifier: token.verifier,
                clientID: token.clientID,
                userID: token.userID,
                approved: token.approved
              }
              done(null, token.secret, info);
            });
          },
          function(timestamp, nonce, done) {
            done(null, true)
          }
        ));
    };
    
    auth.initTokenStrategyRoutes = function(app){}
    auth.addUser = function(username, email, password, callback){auth.authenticate(username, "pass", callback);}
    
    return auth;
    

    };

    authentication.js策略确实验证了使用者密钥和密钥。但它并没有创建我们想要的会话变​​量。我们希望将消费者策略代码放在authentication.js文件中。

    现在这是另一种方法,我们创建了一个名为consumerkey.js的单独文件

    这个方向很重要。我们可以在屏幕上或命令行上输出护照会话。

    var passport = require('passport')
    
    exports.launchLti = [
        passport.authenticate('consumer', { session: false/true [tried both] }),
        function(req, res) {    
    
            db.findByStudentUserId({lis_person_contact_email_primary: 
            req.body.lis_person_contact_email_primary}, function(err, user) {
                req.logIn(user, function(err) {
                   req.user.username = user[0].lis_person_contact_email_primary;
            ...
    
          // req.session.save(function(){
          // res.redirect('/classes');
            res.redirect(200,'/');            
          // });
        });
      })
      // res.render('launch', {launch:  launch});
    }
    }]
    

1 个答案:

答案 0 :(得分:0)

我通过更改一些代码结构解决了这个问题。

    app.pst('/launch/lti/:id', function(req, res, next) {
  passport.authenticate('consumer', {failureRedirect: '/login'}),
      dbConsumerKey.findByStudentUserId({}, 
        function(err, user) {
            if (err) console.log(err, user);
              req.logIn(user, function(err) {
                if (err) return err;
                ADDED -> req.session.valid = true;
                ADDED -> res.redirect('/');        
              });
          }
        });
  });

并修改渲染页面功能以适应传入的信息。

function renderPage(req, res, pageName, pageTitle){
...
this is where the locals are created
...

这使我能够按原样使用当前的本地策略,并添加完全不同的策略路线,但正确地进行会话。