2016-12-23 4 views
0

セキュリティで保護されたログインを作成します。私はセッションを追加したいのですが、どのように一緒に使うべきかを理解できません。express-sessionとexpress-mysql-sessionを使用してログインエンドポイントを作成する方法

私は2つのコードを持っていますが、1つのコードはexpress-mysql-sessionから来て、私が書いたコードはlogin(/ api/login)エンドポイントです。

以下はexpress-mysql-sessionのreadme.mdからコピーしたコードです。

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

var options = { 
    host: 'localhost', 
    port: 3306, 
    user: 'root', 
    password: 'password', 
    database: 'session_test' 
}; 

var sessionStore = new MySQLStore(options); 

app.use(session({ 
    key: 'session_cookie_name', 
    secret: 'session_cookie_secret', 
    store: sessionStore, 
    resave: true, 
    saveUninitialized: true 
})); 

ここで、端末の出力を示します。上のコードはうまくいきましたが、それが何をしたのかは分かりません。私はそれがその後、その後、以下の出力

$ DEBUG=express-mysql-session* node index.js 
express-mysql-session:log Creating session store +0ms 
express-mysql-session:log Setting default options +2ms 
express-mysql-session:log Creating sessions database table +46ms 
express-mysql-session:log Setting expiration interval: 900000ms +42ms 
express-mysql-session:log Clearing expiration interval +0ms 

私はExpressを使用して作成した基本的なログイン認証エンドポイントで、netstatコマンドに

tcp4  0  0 127.0.0.1.3306   127.0.0.1.52470  ESTABLISHED 
tcp4  0  0 127.0.0.1.52470  127.0.0.1.3306   ESTABLISHED 

を使用してローカルで実行しているMySQLへの接続を確立している参照してください。これは動作しますが、express-sessionexpress-mysql-sessionを追加し、crypt, bcrypt or scrypt-for-humansを使用しますが、どのように統合するかはわかりません。

const express = require('express'); 
const bodyParser = require('body-parser'); 
const mysql  = require('mysql'); 
const app = express(); 
app.use(bodyParser.json());  // to support JSON-encoded bodies 
app.use(bodyParser.urlencoded({  // to support URL-encoded bodies 
    extended: true 
})); 

app.set('port', (process.env.API_PORT || 8000)); 

const connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'root', 
    password : 'password', 
    database : 'authdb' 
}); 

connection.connect(function(err) { 
    if (err) { 
    console.error('error connecting: ' + err.stack); 
    return; 
    } 

    console.log('connected as id ' + connection.threadId); 
}); 

app.post('/api/login', function(req, res) { 
    const user_id = req.body.user_id; 
    const password = req.body.password; 
    let response = {}; 
    res.setHeader('Content-Type', 'application/json'); 

    connection.query('SELECT password from user WHERE `username` = "' + user_id + '"' , function(err, rows) { 
    if (err) throw err; 

    if (rows.length > 0) { 
     if (password === rows[0].password) { 
     response.status = 200; 
     response.message = "authenticated"; 
     response.authenticated = true; 
     response.user_id = user_id; 
     } else { 
     response.status = 403; 
     response.message = "Login failed!"; 
     response.authenticated = false; 
     response.user_id = user_id; 
     } 
    } else { 
     response.status = 403; 
     response.message = "Login failed!"; 
     response.authenticated = false; 
     response.user_id = user_id; 
    } 
    res.status(response.status).send(JSON.stringify(response)); 

    }); 

}); 

app.listen(app.get('port'),() => { 
    console.log(`Find the server at: http://localhost:${app.get('port')}/`); 
}); 
+0

authを処理し、基礎知識を得るためのいくつかの例や、潜在的に高水準のライブラリを探してください。そうであるように、あなたはすでにsqliと平文のパスワード記憶装置を持っているようです。パスワードは – pvg

+0

、私は上記のbcryptを使用します。ありがとうございました。 – devwannabe

+0

downvoteとは何ですか?私の主な質問は、高速セッション統合に関連しており、私もコードを含んでいます。 – devwannabe

答えて

0

私はそれを得て、その結果に非常に満足しています。私のログインエンドポイントは素晴らしいです!私は今、それをより良くする方法について、より多くのアイディアを持っています。ここでRESTクライアントのスクリーンショットです - http://i.imgur.com/fJOvmzh.pngは、以下、それを安全にするためにエンドポイント

app.post('/api/login', function(req, res) { 
    const user_id = req.body.user_id; 
    const password = req.body.password; 
    let response = {}; 
    res.setHeader('Content-Type', 'application/json'); 
    connection.query('SELECT * FROM authdb.users as authusers inner join authdb.passwords as hashed on authusers.email = hashed.email WHERE authusers.email = "' + user_id + '"' , function(err, rows) { 
    if (err) throw err; 

    Promise.try(function(){ 
     return scrypt.verifyHash(password, rows[0].password); 
    }).then(function(){ 
     var sess = req.session; 
     if (sess.views) { 
      sess.views++; 
     } else { 
      sess.views = 1 
     } 
     response = { status: 200, message: "Login successful!", authenticated: true, user_id: user_id, views: sess.views } 
     res.status(response.status).send(JSON.stringify(response)); 
    }).catch(scrypt.PasswordError, function(err){ 
     response = { status: 403, message: "Login failed!", authenticated: false, user_id: user_id } 
     res.status(response.status).send(JSON.stringify(response)); 
    }); 
    }); 
}); 

ですが、私はすべてのSSL接続を終了し、NodeJSに明確にすべてのトラフィックを送信しELBの背後にEC2セットアップよ私のExpress auth APIをPM2または他のより良いバランサによって生成された状態で実行しています。 AWS secgroupは、送信元がELBであるトラフィックのみを受け入れます。

関連する問題