5

私はnode.jsにエクスプレスとパスポートを使用したサーバーをpassport-local戦略で持っています。

データベースにユーザーがいて、パスポートを介してそれらを認証できますが、残念ながら同じクライアントから2番目のリクエストが来ると、req.isAuthenticated()メソッドは を返しますfalse。また、リクエストにユーザーが含まれていません ( req.user = undefined)。

私もチェックしましたが、認証を行っているときにユーザーを取得しても、データが入力されpassport.authenticate('local'...ませんreq.user。手動で設定しようとすると、次のリクエストに反映されません。

私が間違っていることを理解していません。ここに私のコードがあります。

サーバー.js

var express = require('express'),
compass = require('node-compass'),
routes = require('./server/routes')
http = require('http'),
path = require('path'),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
Database = require('./server/repositories/database'),
Configuration = require('./server/config').Config,
crypto = require('crypto');

var app = express();

app.enable("jsonp callback");

passport.use(new LocalStrategy(
  function(email, password, done) {
    process.nextTick(function () {
      var userService = new UserService();
      userService.login(email, crypto.createHash('md5').update(password).digest("hex"), function(error, user) {
        if (error) done(error, user);
        else if (!user) return done(null, false, { message: 'wrong credentials'}); 
        return done(null, user);
      });
    });
  }
));

passport.serializeUser(function(user, done) {
  done(null, user._id);
});

passport.deserializeUser(function(id, done) {
  var userService = new UserService();
  userService.findById(id, function(err, user) {
    done(err, user);
  });
});

app.configure(function(){
  app.set('port', Configuration.Port);
  app.set('views', __dirname + '/app/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.cookieParser()); 
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(compass({
    project: path.join(__dirname, 'app'),
      sass: 'styles'
  }));
  app.use(express.session({ secret: 'keyboard cat' }));
  app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
  });
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'app')));
});

routes.configure(app);

Database.open(function() { 
  app.listen(Configuration.Port, function() {
    console.log("Express server listening on port " + Configuration.Port);
  });
});

ルート.js

var Configuration = require('./config').Config;
var ApiResult = require('../model/apiResult').ApiResult;
var ApiErrorResult = require('../model/apiErrorResult').ApiErrorResult;
var ApiReturnCodes = require('../model/apiReturnCodes').ApiReturnCodes;
var passport = require('passport');

var usersController = require('./controllers/usersController');

exports.configure = function(app) {
  function ensureAuthenticated(req, res, next) {
    console.log(req.isAuthenticated());
    if (req.isAuthenticated()) { return next(); }
    else {res.send(new ApiErrorResult(ApiReturnCodes.NOT_LOGGED_IN, null));}
  }

  app.post('/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
      if (err || !user) { console.log(info); res.send(new ApiErrorResult(ApiReturnCodes.ENTITY_NOT_FOUND, null)); }
      // If this function gets called, authentication was successful.
      // `req.user` contains the authenticated user
      else res.send(new ApiResult(user));
    })(req,res,next);
  });

  app.get('/anotherLink', ensureAuthenticated, function(req, res, next) {
    res.json({Code:0});
  });
}

/anotherLink認証後にリンクにアクセスするとres.isAuthenticated()、false になります。

また、が呼び出されたreq.session後に を見ると、次のようになります。ensureAuthenticated

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: {} }

そのユーザーが認証されているという情報を保存するために何が欠けていますか? クライアント側では、Angular を使用して、パラメーターなしで URL を取得するだけです。

ここに何かを入れるのを忘れた場合は、教えてください。更新します。どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

7

だから私は自分のコードのどこが間違っているのかを見つけました。

passport.deserializeUserの方法は方法を使用しましたuserService.findById

そして、それはリポジトリを呼び出しました...次のように:

userRepository.findUnique({"_id": id}, callback);

idは正しい呼び出しによって生成されたため、次のようにMongoDBする必要があります。

userRepository.findUnique({"_id": new ObjectID(id)}, callback);

これにより、同じ問題を抱えている次の人に時間を節約できることを願っています.

LocalStrategyこの詳細により、このコードは、フレームワークでを使用したいすべての人にとってうまく機能するはずPassportです。

于 2013-11-26T10:35:42.673 に答える