2015-11-08 18 views
5

私は最初にpersistent sessions with passport, mongodb and expressを見ましたが、それは役に立たなかったり意味がありませんでした。パスポートは永続的なログインセッションを維持していません

私はwebsiteで永続的なログインを取得しようとしています。私のシリアル化プロセスは機能していません。

// Passport needs to be able to serialize and deserialize users to support persistent login sessions 
passport.serializeUser(function(user, done) { 
    console.log('serializing user:',user.username); 
    //return the unique id for the user 
    return done(null, user._id); 
}); 

//Desieralize user will call with the unique id provided by serializeuser 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
     console.log('deserializing user:',user.username); 
     return done(err, user); 
    }); 
}); 

パスポートファイル全体がgithubにあります。

私は問題は、私が直ちにデシリアライズされるか、またはconsole.logsが表示するものが少なくともそれだと思います。

それとも、私のセッションで次のようになります。

app.use(session({ 
    secret: 'keyboard cat', 
    cookie : { 
     maxAge: 3600000 // see below 
    } 
})); 

ここに私のユーザーのスキーマです:助けを

var userSchema = new mongoose.Schema({ 
    username : String, 
    password : String, //Hash 
    created_at : {type: Date, default : Date.now} 
}); 

ありがとう!

答えて

2

問題はパスポートやバックエンドにありません。フロントエンドに角度があります。ユーザーがログイン操作を行ったときにのみ$rootScope.authenticatedを設定していますが、アプリを初期化するたびにapiを呼び出してユーザーが既にログインしているかどうかを確認する必要があります。

だから、おそらく、routes/api.jsのいずれかでnullを返す必要がありますrouter.route('/current_user')ルート(またはゲストユーザーオブジェクトのいくつかの種類)を作成したり、フロントエンドの角度アプリは、ユーザーかどうかを知ることができますように、それは、現在のユーザーの情報でログインして返します。ログインしているかどうかを確認してください。 /api/current_userがユーザーを提供する場合は、ログインしていることを知っており、$rootScope.authenticated = trueを設定することができます。

+0

申し訳ありません私は今この答えを見ました。病気を見て!これは修正のようです – Manu

3

あなたが言及リンクに、persistent sessions with passport, mongodb and expressは、"express": "~4.13.1"https://github.com/manu354/teecher/blob/master/package.json、特急フレームワークの古いバージョン、あなたはpackage.jsonに使用されている1つの話をされ、非常に新しいです。

あなたはこれらの行に移動する必要があります:http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/、私はあなたがこのブログの記事に従うことをお勧めしますapp.use(session({...})

の直下にあることを、少し上の

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

を、それは間違いなくあなた

役立ちます
+0

これで解決しません。 – Manu

0

誰にも役立つ場合にだけ投稿してください。

クライアント/ブラウザがSet-Cookieヘッダーを実行しているかどうかを確認してください。

私の場合、Safariでは問題なく動作していましたが、ChromeやFirefoxでは正常に動作していませんでした。明らかに、クライアント側の問題は、サーバー側のコードを識別するブラウザがなかったためです。 SafariとChrome/Firefoxの違いの1つは、fetch polyfillがSafariで使用されていて、ChromeとFirefoxがそれをネイティブにサポートしていたことでした。 fetchは、credentialsをオプションで指定しない限り、Set-Cookieヘッダーを使用しません。

関連する問題