2016-09-21 3 views
2

Passport.jsを使用してFacebookを介してユーザーを認証するアプリケーションがあり、これを正常に実行できます。しかし、node.jsサーバーがリセットされるたびに、ユーザーはログアウトされます。passport.js、mysql、およびexpress-sessionを使用したログイン状態の維持

express-sessionsはログイン状態を維持する方法ですが、私が読んだすべての回答は、これを達成するためにはmongodbまたはredisを使用する必要があると思われます。私たちはMysqlを使用しています。

ログイン状態を維持するためにmysqlでexpress-sessionsを使用する方法はありますか?

答えて

1

これを実現するには、session(express-session)を使用できます。 私は現在、この組み合わせを使用しています express、express-session、express-mysql-session(ストレージ用)、facebookとtwitterの戦略を持つパスポート基本的な設定は、このようなものになる可能性があります。

var express = require('express'); 
var session = require('express-session'); 
var MySQLStore = require('express-mysql-session')(session); 
var app = express(); 

var options = { 
    host: '',// Host name for database connection. 
    port: '',// Port number for database connection. 
    user: '',// Database user. 
    password: '',// Password for the above database user. 
    database: ''// Database name 
}; 
var connection = mysql.createConnection(options); 
var sessionStore = new MySQLStore({ 
    checkExpirationInterval: 900000,// How frequently expired sessions will be cleared; milliseconds. 
    expiration: 86400000,// The maximum age of a valid session; milliseconds. 
    createDatabaseTable: true,// Whether or not to create the sessions database table, if one does not already exist. 
    schema: { 
     tableName: 'sessions', 
     columnNames: { 
      session_id: 'session_id', 
      expires: 'expires', 
      data: 'data' 
     } 
    } 
}, connection); 

app.use(session({ 
    key: 'MyKey', 
    secret: 'MySecret', 
    cookie: {domain: '.mydomain.com', httpOnly: true, secure: false}, 
    domain: '.mydomain.com', 
    store: sessionStore, 
    resave: true, 
    saveUninitialized: true 
})); 

/** 
* Session handle for passport 
*/ 
app.use(passport.initialize()); 
app.use(passport.session()); 

/** 
* Check if user is authenticated in a route 
*/ 
function authUser (req, res, next) { 
    if (!req.isAuthenticated()) { 
     res.redirect('/login') 
    } else { 
     next(); 
    } 
} 

router.get('/hello', authUser, function(req, res){ 
    //Code 
}); 


/** 
* Start the server on port defined by configuration 
*/ 
app.set('port', process.env.PORT || 3000); 
var server = app.listen(app.get('port')); 

ではより多くの情報:応答のための

https://github.com/expressjs/session

https://github.com/chill117/express-mysql-session

+0

ありがとう!私は私のアプリで上記のコードを実装しており、sessionStoreはmysql DBとの会話に成功しています。私はまだこれを使用してログイン状態を維持する方法を考え出すのに苦労しています。私は "loginRequest"と呼ばれるmysqlテーブルを作成し、これは私がtableNameプロパティで使用しているテーブルです。奇妙なことが起こっています。私が自分のサイトのルートにたどり着くたびに、約30のエントリがloginRequestテーブルに入れられます。どうしてこれなの? – user2796352

+0

いいえ...おそらく、ユーザーがルートコードに到達する前に、ユーザーが認証されているかどうかを確認する必要があります。私は各ルートでユーザーを認証するために使用するコードを使って答えを編集します。 – manuerumx

+0

私はちょうどチェックしました....パスポートのdeserialize関数は決して命中しません。これは明らかに大きな問題であり、ログインセッションを継続する前に対処する必要があります – user2796352

関連する問題