2016-12-23 3 views
0

보안 로그인을 만들고 싶습니다. 세션을 추가하고 싶지만 어떻게 함께 사용해야하는지 알 수 없습니다.express-session 및 express-mysql-session을 사용하여 로그인 끝점을 만드는 방법

나는 2 개의 코드를 가지고 있는데, 하나의 코드는 express-mysql-session에서 왔고 내가 작성한 코드와 로그인 (/ 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 
})); 

다음은 터미널의 출력입니다. 위의 코드는 잘 돌아 갔지만 실제로 무엇을했는지는 확실하지 않았습니다. 나는 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 

$ 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를 사용하여 만든 기본 로그인 인증 엔드 포인트 인 출력을 사용하여 로컬로 실행 MySQL의 연결을 설립했다 참조하십시오. 이 작동하지만 , express-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

인증을 처리하고 잠재적 인 고급 라이브러리를 검색하여 기본 기능을 직접 활용 해보십시오. 그것이 그렇듯이, 당신은 이미 sqli vuln과 plaintext 암호 저장소를 가지고있는 것처럼 보입니다. 비밀번호는 – pvg

+0

이고, 위에서 언급 한 bcrypt를 사용할 것입니다. 고맙습니다. – devwannabe

+0

downvote는 무엇입니까? 내 주요 질문은 표현 세션 통합과 관련이 있었고 코드도 포함되었습니다. – devwannabe

답변

0

결과가 매우 만족 스럽습니다. 로그인 끝점이 훌륭하게 작동합니다! 이제는 더 나은 아이디어를 얻으려고합니다. 내가 설정 모든 SSL 연결을 종료하고 NodeJS에 일반 텍스트로 모든 트래픽을 보내는 ELB 뒤에 EC2를 거 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)); 
    }); 
    }); 
}); 

그것은 보안을 위해 엔드 포인트를이다 - 여기 REST 클라이언트의 스크린 샷입니다 내 Express Auth API가 PM2 또는 다른 더 나은 밸런서에 의해 생성됩니다. AWS secgroup은 출처가 ELB 인 트래픽 만 허용합니다.

관련 문제