43

mongodb に保存されているユーザーを認証するための Passport セットアップがあります。正常に動作しているようです: 認証は適切に成功/失敗し、セッション変数が設定されます。ただし、Passport でセッションを確認することはできません。deserializeUserコールバックに追加した console.log ステートメントが日の目を見ないという点で、何かがかなり間違っているようです。私の問題は、deserializeUser呼び出されないことに関連していると思います。私の失敗を診断できる人はいますか?

// Passport configuration
passport.serializeUser(function(user, cb){ cb(null, user.id) });
passport.deserializeUser(function(uid, cb){
  console.log("Trying to deserialize user: "+uid);
  User.findById(uid, function(err, user){
    cb(err, user);
  });
});
// auth strategy function
passport.use(new LocalStrategy({usernameField: 'email'},
  function(email, pass, done){
    User.findOne({email: email}, function (err, user) {
      if (err)
        return done(err);
      if (!user)
        return done(null, false, {message: "Couldn't find user"});
      var crypted = bcrypt.hashSync(pass, user.salt);
      if(user.hashpass != crypted)
        return done(null, false, {message: "Bad password"});
      return done(null, user);
    });
  }
));

passport.CreateSession =  function (req, res, next) {
  passport.authenticate('local', function(err, user, info){
    if(err || !user)
      return res.json({status: "Failure: "+err});
    req.logIn(user, function (err){
      if(err)
        return res.json({status: "Failure: "+err});
      return res.json({status: "Authenticated"});
    });
  })(req, res, next);
};

app.js で次のように指定します。

app.post('/session', passport.CreateSession); // restify better
app.del('/session', passport.DestroySession);
app.get('/images', passport.CheckSession, routes.images);
4

12 に答える 12

43

この問題を抱えている他の人は、これを見てください。

app.use(session({ 
    secret: 'something', 
    cookie: { 
        secure: true
    }}));

trueにcookie.secure設定し、SSL (つまり、https プロトコル) を使用していない場合、セッション ID を含む Cookie はブラウザーに返されず、すべてが暗黙のうちに失敗します。このフラグを削除すると問題が解決しました。これに気付くのに何時間もかかりました!

于 2014-04-16T20:20:57.687 に答える
29

authenticateパスポートで認証するときにコールバックを使用している場合は、ユーザーを手動でログインする必要があります。あなたのために呼び出されることはありません。

passport.authenticate('local', function (err, user) {
    req.logIn(user, function (err) { // <-- Log user in
       return res.redirect('/'); 
    });
})(req, res);
于 2016-02-14T05:06:42.130 に答える
13

use()ミドルウェアを使用したことがありますpassport.session()か? この例のように:

https://github.com/jaredhanson/passport-local/blob/v1.0.0/examples/login/app.js#L91

それがセッションを復元して を呼び出すものdeserializeUserなので、それが欠落しているように聞こえます。

于 2012-06-30T21:29:02.797 に答える
1

私は一日中同じ問題と戦った。認証を行うためにカスタムコールバックを設定しました(http://passportjs.org/guide/authenticate/の下部にあるように))。Passport は、他のミドルウェアにヒットする前にすべてのリクエスト オブジェクトを前処理しているようです (私が書いたいくつかのログ ステートメントに基づく)。その前処理の一環として、デシリアライズされたユーザー情報を request.user オブジェクトに配置します。残念ながら、passport.authenticate ('local', callback) のデフォルトの動作は、セッションまたは Cookie データを無視し、代わりにユーザー名と PW が要求オブジェクトで送信されていると想定するようです。これを修正するために私がしたことは、最初に request.user オブジェクトをチェックすることでした。存在する場合は、Passport が前処理を行ったことを意味し、login を直接呼び出すことができました。これは、passport.authenticate('local') の代わりに使用する認証関数です。

function doAuth(request, response, next)
{ 

if (request.user) {
    request.logIn(request.user, function (err) {
        if (err) {
            console.log(err);
            response.status(500).json({message:
                    "Login failed. Auth worked. Nonsense"});
            return;
        }
        console.log("doAuth: Everything worked.");
        next();
    });
    return;
}

passport.authenticate('local', function(err, user, info) {
    if (err) {
        response.status(500).json({message: "Boo Passport!"});
        return; //go no further
        //until I figure out what errors can get thrown
    }
    if (user === false) {
        console.log("Authentication failed. Here is my error:");
        console.log(err);
        console.log("Here is my info:");
        console.log(info);
        response.status(500).json({message: "Authentication failed."});
        return;
    }
    request.logIn(user, function(err) {
        if (err) {
        console.log("Login failed. This is the error message:");
        console.log(err);
        response.status(500).json({message:"Login failed."});
            return;
        }
        console.log("doAuth: Everything worked. I don't believe it.");

        next();
    });
})(request, response, next);

 }
于 2014-11-15T08:06:06.270 に答える
0

私の場合、私は配置しました

app.use(cookieSession({
  maxAge : 60*60*1000,
  keys : [key.cookieSession.key1]
}));

その上

app.use(passport.initialize());
app.use(passport.session());

そしてそれはうまくいきました。

于 2019-07-13T09:17:49.540 に答える
-4
passport.serializeUser(
    function(user, done){
        done(null, user.id);
});

passport.deserializeUser(
    function(id, done){
        User.findById(id, function(err, user){
            if(err){
                done(err);
            }
            done(null, user);
        });
});

**> try this one**
于 2013-12-02T10:04:25.837 に答える