2017-04-17 6 views
1

Passport Consumer Strategyをセットアップし、それを「ローカル」に統合するための助けが必要です(現時点では、ローカル戦略はうまく機能しています)。私たちはいくつかのアプローチを試みましたが、100%稼働していませんでした。以下のコードは完全なコードではありません。私たちはいくつかのコードを取り出していますので、この投稿は長すぎるものではありません。これに関する助けがあれば、大いに感謝するでしょう。誰かがこの障害を乗り越えることができれば、補償もあります。Passportコンシューマー戦略を使用してグローバルセッションを設定する

ユーザーがコンシューマーキーと秘密で認証されている場合、Passportはセッション変数をどのように格納してサイト全体で使用するのでしょうか?

2番目の質問ですが、ユーザーが認証プロセスに合格した後、そのユーザーをどのように処理しますか?

  1. 地域と消費者の両方が働く必要があります。
  2. プロバイダによるPOSTを使用したコンシューマキーと秘密< - 必要に応じて投稿の一部を表示できます。
  3. これはOAuth1である必要があります。現在、OAuth2はオプションではありません。
  4. これは、シングルサインオン認証用です。
  5. 必要に応じてコンシューマセッションの出力を提供できます。

最終的には、ローカル戦略と消費者戦略が同じ「ローカル」グローバル変数を使用して作業したいと考えています。私が知る限り、消費者を認証し、DBからユーザーを取得し、セッションを作成し、ユーザーが「sureAuthenticated」であるかどうかを確認することができます。

これは私たちが今働いているものです。

ローカル戦略が正しく認証されています。

我々は、これらのローカル変数を持つページレンダリング:「時間を節約するために、コードの大部分を省略」

//================================================================= 
// 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ファイルに入れることを希望します。


別の方法として、コンシューマキーという別のファイルを作成しました。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 
... 

これにより、現在のローカル戦略をそのまま使用して、全く異なる戦略ルートを追加してセッションを正しく行うことができました。

関連する問題