2017-04-17 45 views
1

我需要一些幫助來設置Passport Consumer Strategy並將其集成到「本地人」(現在,我們的本地策略工作得很好)。我們已經嘗試了幾種方法,但沒有運氣,它工作100%。下面的代碼不是完整的代碼,我們已經拿出了一些代碼,所以這篇文章不會太長。任何幫助,這將非常感激。如果有人能夠幫助我們渡過這個障礙,也可能會有補償。使用Passport Consumer策略設置全局會話

所以一個問題是,如果用戶通過消費者密鑰和祕密進行身份驗證,Passport如何存儲會話變量以便在整個站點中使用它們?

第二個問題,我們如何處理通過認證過程後的用戶?

  1. 本地和消費者都需要工作。
  2. 消費者密鑰和提供商使用POST的祕密< - 如果需要,我可以顯示一些帖子。
  3. 這需要是OAuth1僅限於現在,OAuth2不是一個選項。
  4. 這是用於單點登錄認證。
  5. 如果需要,我可以提供消費者會話輸出。

最終,我們希望本地策略和消費者策略與相同的「本地」全局變量一起工作。據我所知,我們可以驗證消費者,從我們的數據庫檢索用戶,創建一個會話,並可以告訴用戶是否「ensureAuthenticated」。

這是我們現在正在開展的工作。

本地策略正確認證。

我們使用這些局部變量渲染頁面: 「省略大部分代碼以節省時間」。

//================================================================= 
// 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}); 
} 
}] 

回答

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 
... 

這使我可以使用我當前的本地策略,並添加完全不同的策略路由,但會話正確。