2016-11-17 3 views
0

Passport.jsを使用した認証設定が非常に簡単です。ユーザーが認証されると、私はそれらを/ workにリダイレクトします。Passport.js認証後にExpress.jsが正しくルーティングされない

app.post('/login', 
    passport.authenticate('local', { 
     successRedirect: '/work', 
     failureRedirect: '/login', 
     failureFlash: true 
    }) 
); 

認証プロセス全体が正常に動作します。つまり、プログラムは間違ったユーザ/パスワードのコンボなどを拒否します。実際の問題は、私のプログラムが/ workにリダイレクトされるときです。

上記のように、successRedirectは/ workにリダイレクトする必要があります。私は、ユーザーがログインしている場合はそうのように、チェックするためのミドルウェアを持っている:

function loggedIn(req, res, next) { 
    console.log('call to login, ' + req.user); 
    if (req.user) { 
     console.log('calling next...'); 
     next(); 
    } else { 
     console.log('redirecting...'); 
     res.redirect('/login'); 
    } 
} 

をそして、私の/作業GET要求は次のようになります。

app.get('/work', loggedIn, function (req, res, next) { 
    console.log('call to go to work') 
    res.render("projects.html", { 
     projects: getProjects() 
    }); 
}); 

問題は、それはむしろ伐採後に/仕事にリダイレクトするよりもですブラウザは[オブジェクトオブジェクト]を表示します。 [オブジェクトオブジェクト]もコンソールに記録されます。それは/仕事にも到達しません。/work GETリクエストからloggedInを削除すると、ページが正しくレンダリングされ、ルーティングの問題であることがわかります。明白な何かを逃したことがありますか?あなたが与えることができる任意の助けのためにあまり前もってありがとう! :)に処理中にコンソールに記録

redirecting... 
Authentication success! 
[object Object] 

シリアル化とデシリアライズ機能:

passport.serializeUser(function (user, cb) { 
    cb(null, user.Email); 
}); 
passport.deserializeUser(function (email, cb) { 
    getInfo(email, function (user) { 
     cb(user); 
    }); 
}); 

私は、私のconsole.logsのいずれかで、[オブジェクトのオブジェクト]を印刷することはありませんのでご注意くださいこれは謎のようです。

+0

'ので、URLは'/login'に滞在し、それだけを示して[オブジェクトオブジェクト] '?コンソールには何が印刷されますか? –

+0

申し訳ありませんが、私は言い換えましょう - それは/ログインに正しくリダイレ​​クトします。私は正しくログインしていますが、/ workにリダイレクトすると、[object object]というページが表示されます。このシナリオのコンソールは、[オブジェクトオブジェクト]もログに記録します。これは、コンソールログがないため、奇妙です(どちらもチェックしました)。 –

+0

最後の段落[here](http://passportjs.org/docs/authenticate)の説明に従ってカスタムコールバックを試しましたか? – rkm

答えて

0

あなたのデシリアライザは、右見ていない:ノードのコールバックの

passport.deserializeUser(function (email, cb) { 
    getInfo(email, function (user) { 
     cb(user); 
    }); 
}); 

共通の規約は、最初の引数は常にエラーを渡すために使用されていることです。何もない場合、最初の引数は偽でなければなりません(一般的にはnullです)。

私はgetInfoが自分で実装されているかどうかはわかりませんが、正しい規則を使用していません。私はそうすることを強く勧めます。

いずれの場合でも、Passportはエラーが発生したと考えているため、問題の原因として考えられます。

passport.deserializeUser(function (email, cb) { 
    getInfo(email, cb); 
}); 

あるいは短い:getInfo一度

が固定され、あなたがこれにデシリアライザを書き換えることができ

passport.deserializeUser(getInfo); 
+0

ありがとう!少し修正した後、修正されました。 (これは誤った取り扱いのためでした!) –

関連する問題