Showing
11 changed files
with
335 additions
and
289 deletions
... | @@ -17,6 +17,10 @@ var router = express.Router(); | ... | @@ -17,6 +17,10 @@ var router = express.Router(); |
17 | var cookieParser = require('cookie-parser') | 17 | var cookieParser = require('cookie-parser') |
18 | var ExpressSession = require('express-session') | 18 | var ExpressSession = require('express-session') |
19 | 19 | ||
20 | +var database = require('./database/database'); | ||
21 | +var config = require('./config'); | ||
22 | + | ||
23 | + | ||
20 | // get port | 24 | // get port |
21 | var port = process.env.PORT || 3000; | 25 | var port = process.env.PORT || 3000; |
22 | app.set('port',port); | 26 | app.set('port',port); |
... | @@ -64,9 +68,25 @@ app.use(expressErrorHandler.httpError(404)); | ... | @@ -64,9 +68,25 @@ app.use(expressErrorHandler.httpError(404)); |
64 | app.use(errorHandler); | 68 | app.use(errorHandler); |
65 | 69 | ||
66 | 70 | ||
71 | +// 프로세스 종료 시에 데이터베이스 연결 해제 | ||
72 | +process.on('SIGTERM', function () { | ||
73 | + console.log("프로세스가 종료됩니다."); | ||
74 | + app.close(); | ||
75 | +}); | ||
76 | + | ||
77 | +app.on('close', function () { | ||
78 | + console.log("Express 서버 객체가 종료됩니다."); | ||
79 | + if (database.db) { | ||
80 | + database.db.close(); | ||
81 | + } | ||
82 | +}); | ||
83 | + | ||
67 | 84 | ||
68 | // for server listening | 85 | // for server listening |
69 | var server = http.createServer(app) | 86 | var server = http.createServer(app) |
70 | server.listen(port,function(){ | 87 | server.listen(port,function(){ |
71 | console.log('익스프레스 서버를 시작했습니다.'); | 88 | console.log('익스프레스 서버를 시작했습니다.'); |
89 | + | ||
90 | + database.init(app, config); | ||
72 | }) | 91 | }) |
92 | + | ... | ... |
app/config.js
0 → 100644
1 | +module.exports = { | ||
2 | + server_port: 3000, | ||
3 | + db_url: 'mongodb://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites=true&w=majority', | ||
4 | + db_schemas: [ | ||
5 | + {file:'./user_schema', collection:'users3', schemaName:'UserSchema', modelName:'UserModel'} | ||
6 | + ] | ||
7 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
app/database/Connection.js
deleted
100644 → 0
1 | -const mysql = require('mysql') | ||
2 | - | ||
3 | -var pool = mysql.createPool({ | ||
4 | - host: "localhost", | ||
5 | - user: "root", | ||
6 | - password: "1234", | ||
7 | - port: 3306, | ||
8 | - database: "rest_stop" | ||
9 | -}) | ||
10 | - | ||
11 | -var adduser = function(name, id, password, callback) { | ||
12 | - console.log('addUser'); | ||
13 | - | ||
14 | - pool.getConnection(function(err, conn) { | ||
15 | - if(err){ | ||
16 | - if(conn){ | ||
17 | - conn.release(); | ||
18 | - } | ||
19 | - | ||
20 | - callback(err, null); | ||
21 | - return; | ||
22 | - } | ||
23 | - | ||
24 | - var data = {name:name, id:id, password:password}; | ||
25 | - | ||
26 | - var exec = conn.query('insert into users set ?', data, function(err, result) { | ||
27 | - conn.release(); | ||
28 | - | ||
29 | - if(err){ | ||
30 | - console.log('SQL 실행 시 오류 발생'); | ||
31 | - console.dir(err); | ||
32 | - | ||
33 | - callback(err,null); | ||
34 | - | ||
35 | - return; | ||
36 | - } | ||
37 | - | ||
38 | - callback(null, result); | ||
39 | - }) | ||
40 | - }) | ||
41 | -} | ||
42 | - | ||
43 | -var authUser = function(id, password, callback) { | ||
44 | - console.log('authUser 호출'); | ||
45 | - | ||
46 | - pool.getConnection(function(err, conn) { | ||
47 | - if(err){ | ||
48 | - if(conn){ | ||
49 | - conn.release(); | ||
50 | - } | ||
51 | - | ||
52 | - callback(err, null); | ||
53 | - return; | ||
54 | - } | ||
55 | - | ||
56 | - var colums = ['name', 'id']; | ||
57 | - var tablename = 'users'; | ||
58 | - | ||
59 | - var exec = conn.query("select ?? from ?? where id = ? and password = ?", | ||
60 | - [colums, tablename, id, password], function(err, rows) { | ||
61 | - conn.release(); | ||
62 | - | ||
63 | - if(rows.length >0){ | ||
64 | - console.log('Id [%s], password [$s] 일치하는 사용자 찾음', id, password); | ||
65 | - callback(null, rows); | ||
66 | - } else { | ||
67 | - console.log('일치하는 사용자 없음'); | ||
68 | - callback(null, null); | ||
69 | - } | ||
70 | - } | ||
71 | - ); | ||
72 | - }) | ||
73 | -} | ||
74 | - | ||
75 | -module.exports.pool = pool; | ||
76 | -module.exports.authUser = authUser; | ||
77 | -module.exports.adduser = adduser; | ||
78 | -//module.exports.listuser = listuser; |
app/database/User.js
deleted
100644 → 0
1 | -const Connection = require('./Connection') | ||
2 | - | ||
3 | -var adduser = async (username,userId,userPassword) => { | ||
4 | - try { | ||
5 | - const query = `INSERT INTO ` + | ||
6 | - `accounts ` + | ||
7 | - `VALUES ` + | ||
8 | - `(null, '$(username)', '$(userId)', '$(userPassword)')` | ||
9 | - | ||
10 | - await Connection(query) | ||
11 | - | ||
12 | - return true; | ||
13 | - } catch (error) { | ||
14 | - return false; | ||
15 | - } | ||
16 | -}; | ||
17 | - | ||
18 | -var login; | ||
19 | - | ||
20 | -var listuser = function(req, res) { | ||
21 | - console.log('user(user2.js) 모듈 안에 있는 listuser 호출됨.'); | ||
22 | - | ||
23 | - // 데이터베이스 객체 참조 | ||
24 | - var database = req.app.get('database'); | ||
25 | - | ||
26 | - // 데이터베이스 객체가 초기화된 경우, 모델 객체의 findAll 메소드 호출 | ||
27 | - if (database.db) { | ||
28 | - // 1. 모든 사용자 검색 | ||
29 | - database.UserModel.findAll(function(err, results) { | ||
30 | - // 에러 발생 시, 클라이언트로 에러 전송 | ||
31 | - if (err) { | ||
32 | - console.error('사용자 리스트 조회 중 에러 발생 : ' + err.stack); | ||
33 | - | ||
34 | - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
35 | - res.write('<h2>사용자 리스트 조회 중 에러 발생</h2>'); | ||
36 | - res.write('<p>' + err.stack + '</p>'); | ||
37 | - res.end(); | ||
38 | - | ||
39 | - return; | ||
40 | - } | ||
41 | - | ||
42 | - if (results) { | ||
43 | - console.dir(results); | ||
44 | - | ||
45 | - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
46 | - res.write('<h2>사용자 리스트</h2>'); | ||
47 | - res.write('<div><ul>'); | ||
48 | - | ||
49 | - for (var i = 0; i < results.length; i++) { | ||
50 | - var curId = results[i]._doc.id; | ||
51 | - var curName = results[i]._doc.name; | ||
52 | - res.write(' <li>#' + i + ' : ' + curId + ', ' + curName + '</li>'); | ||
53 | - } | ||
54 | - | ||
55 | - res.write('</ul></div>'); | ||
56 | - res.end(); | ||
57 | - } else { | ||
58 | - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
59 | - res.write('<h2>사용자 리스트 조회 실패</h2>'); | ||
60 | - res.end(); | ||
61 | - } | ||
62 | - }); | ||
63 | - } else { | ||
64 | - res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
65 | - res.write('<h2>데이터베이스 연결 실패</h2>'); | ||
66 | - res.end(); | ||
67 | - } | ||
68 | - | ||
69 | -}; | ||
70 | - | ||
71 | - | ||
72 | -//사용자를 인증하는 함수 : 아이디로 먼저 찾고 비밀번호를 그 다음에 비교하도록 함 | ||
73 | -var authUser = function(database, id, password, callback) { | ||
74 | - console.log('authUser 호출됨.'); | ||
75 | - | ||
76 | - // 1. 아이디를 이용해 검색 | ||
77 | - database.UserModel.findById(id, function(err, results) { | ||
78 | - if (err) { | ||
79 | - callback(err, null); | ||
80 | - return; | ||
81 | - } | ||
82 | - | ||
83 | - console.log('아이디 [%s]로 사용자 검색결과', id); | ||
84 | - console.dir(results); | ||
85 | - | ||
86 | - if (results.length > 0) { | ||
87 | - console.log('아이디와 일치하는 사용자 찾음.'); | ||
88 | - | ||
89 | - // 2. 패스워드 확인 : 모델 인스턴스를 객체를 만들고 authenticate() 메소드 호출 | ||
90 | - var user = new database.UserModel({id:id}); | ||
91 | - var authenticated = user.authenticate(password, results[0]._doc.salt, results[0]._doc.hashed_password); | ||
92 | - if (authenticated) { | ||
93 | - console.log('비밀번호 일치함'); | ||
94 | - callback(null, results); | ||
95 | - } else { | ||
96 | - console.log('비밀번호 일치하지 않음'); | ||
97 | - callback(null, null); | ||
98 | - } | ||
99 | - | ||
100 | - } else { | ||
101 | - console.log("아이디와 일치하는 사용자를 찾지 못함."); | ||
102 | - callback(null, null); | ||
103 | - } | ||
104 | - | ||
105 | - }); | ||
106 | - | ||
107 | -} | ||
108 | - | ||
109 | - | ||
110 | -//사용자를 등록하는 함수 | ||
111 | -var addUser = function(database, id, password, name, callback) { | ||
112 | - console.log('addUser 호출됨.'); | ||
113 | - | ||
114 | - // UserModel 인스턴스 생성 | ||
115 | - var user = new database.UserModel({"id":id, "password":password, "name":name}); | ||
116 | - | ||
117 | - // save()로 저장 | ||
118 | - user.save(function(err) { | ||
119 | - if (err) { | ||
120 | - callback(err, null); | ||
121 | - return; | ||
122 | - } | ||
123 | - | ||
124 | - console.log("사용자 데이터 추가함."); | ||
125 | - callback(null, user); | ||
126 | - | ||
127 | - }); | ||
128 | -} | ||
129 | - | ||
130 | - | ||
131 | -module.exports.login = login; | ||
132 | -module.exports.adduser = adduser; | ||
133 | -module.exports.listuser = listuser; | ||
134 | - |
app/database/database.js
0 → 100644
1 | +var mongoose = require('mongoose'); | ||
2 | +var db_url = 'mongodb+srv://oss:12341234@cluster0.us5lm.mongodb.net/?retryWrites=true&w=majority'; | ||
3 | +// database 객체에 db, schema, model 모두 추가 | ||
4 | +var database = {}; | ||
5 | + | ||
6 | +// 초기화를 위해 호출하는 함수 | ||
7 | +database.init = function(app, config) { | ||
8 | + console.log('init() 호출됨.'); | ||
9 | + | ||
10 | + connect(app, config); | ||
11 | +} | ||
12 | + | ||
13 | +//데이터베이스에 연결하고 응답 객체의 속성으로 db 객체 추가 | ||
14 | +function connect(app, config) { | ||
15 | + console.log('connect() 호출됨.'); | ||
16 | + | ||
17 | + // 데이터베이스 연결 : config의 설정 사용 | ||
18 | + mongoose.Promise = global.Promise; // mongoose의 Promise 객체는 global의 Promise 객체 사용하도록 함 | ||
19 | + mongoose.connect(db_url); | ||
20 | + | ||
21 | + database.db = mongoose.connection; | ||
22 | + | ||
23 | + database.db.on('error', console.error.bind(console, 'mongoose connection error.')); | ||
24 | + database.db.on('open', function () { | ||
25 | + console.log('데이터베이스에 연결되었습니다. : ' + db_url); | ||
26 | + | ||
27 | + // config에 등록된 스키마 및 모델 객체 생성 | ||
28 | + createSchema(app, config); | ||
29 | + | ||
30 | + }); | ||
31 | + database.db.on('disconnected', connect); | ||
32 | + | ||
33 | +} | ||
34 | + | ||
35 | +// config에 정의된 스키마 및 모델 객체 생성 | ||
36 | +function createSchema(app, config) { | ||
37 | + var schemaLen = config.db_schemas.length; | ||
38 | + console.log('설정에 정의된 스키마의 수 : %d', schemaLen); | ||
39 | + | ||
40 | + for (var i = 0; i < schemaLen; i++) { | ||
41 | + var curItem = config.db_schemas[i]; | ||
42 | + | ||
43 | + // 모듈 파일에서 모듈 불러온 후 createSchema() 함수 호출하기 | ||
44 | + var curSchema = require(curItem.file).createSchema(mongoose); | ||
45 | + console.log('%s 모듈을 불러들인 후 스키마 정의함.', curItem.file); | ||
46 | + | ||
47 | + // User 모델 정의 | ||
48 | + var curModel = mongoose.model(curItem.collection, curSchema); | ||
49 | + console.log('%s 컬렉션을 위해 모델 정의함.', curItem.collection); | ||
50 | + | ||
51 | + // database 객체에 속성으로 추가 | ||
52 | + database[curItem.schemaName] = curSchema; | ||
53 | + database[curItem.modelName] = curModel; | ||
54 | + console.log('스키마 이름 [%s], 모델 이름 [%s] 이 database 객체의 속성으로 추가됨.', curItem.schemaName, curItem.modelName); | ||
55 | + } | ||
56 | + | ||
57 | + app.set('database', database); | ||
58 | + console.log('database 객체가 app 객체의 속성으로 추가됨.'); | ||
59 | +} | ||
60 | + | ||
61 | + | ||
62 | +// database 객체를 module.exports에 할당 | ||
63 | +module.exports = database; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
app/database/user_schema.js
0 → 100644
1 | +var crypto = require('crypto'); | ||
2 | + | ||
3 | +var Schema = {}; | ||
4 | + | ||
5 | +Schema.createSchema = function(mongoose) { | ||
6 | + | ||
7 | + // 스키마 정의 | ||
8 | + var UserSchema = mongoose.Schema({ | ||
9 | + id: {type: String, required: true, unique: true, 'default':''}, | ||
10 | + hashed_password: {type: String, required: true, 'default':''}, | ||
11 | + salt: {type:String, required:true}, | ||
12 | + name: {type: String, index: 'hashed', 'default':''}, | ||
13 | + age: {type: Number, 'default': -1}, | ||
14 | + created_at: {type: Date, index: {unique: false}, 'default': Date.now}, | ||
15 | + updated_at: {type: Date, index: {unique: false}, 'default': Date.now} | ||
16 | + }); | ||
17 | + | ||
18 | + // password를 virtual 메소드로 정의 : MongoDB에 저장되지 않는 편리한 속성임. 특정 속성을 지정하고 set, get 메소드를 정의함 | ||
19 | + UserSchema | ||
20 | + .virtual('password') | ||
21 | + .set(function(password) { | ||
22 | + this._password = password; | ||
23 | + this.salt = this.makeSalt(); | ||
24 | + this.hashed_password = this.encryptPassword(password); | ||
25 | + console.log('virtual password 호출됨 : ' + this.hashed_password); | ||
26 | + }) | ||
27 | + .get(function() { return this._password }); | ||
28 | + | ||
29 | + // 스키마에 모델 인스턴스에서 사용할 수 있는 메소드 추가 | ||
30 | + // 비밀번호 암호화 메소드 | ||
31 | + UserSchema.method('encryptPassword', function(plainText, inSalt) { | ||
32 | + if (inSalt) { | ||
33 | + return crypto.createHmac('sha1', inSalt).update(plainText).digest('hex'); | ||
34 | + } else { | ||
35 | + return crypto.createHmac('sha1', this.salt).update(plainText).digest('hex'); | ||
36 | + } | ||
37 | + }); | ||
38 | + | ||
39 | + // salt 값 만들기 메소드 | ||
40 | + UserSchema.method('makeSalt', function() { | ||
41 | + return Math.round((new Date().valueOf() * Math.random())) + ''; | ||
42 | + }); | ||
43 | + | ||
44 | + // 인증 메소드 - 입력된 비밀번호와 비교 (true/false 리턴) | ||
45 | + UserSchema.method('authenticate', function(plainText, inSalt, hashed_password) { | ||
46 | + if (inSalt) { | ||
47 | + console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText, inSalt), hashed_password); | ||
48 | + return this.encryptPassword(plainText, inSalt) === hashed_password; | ||
49 | + } else { | ||
50 | + console.log('authenticate 호출됨 : %s -> %s : %s', plainText, this.encryptPassword(plainText), this.hashed_password); | ||
51 | + return this.encryptPassword(plainText) === this.hashed_password; | ||
52 | + } | ||
53 | + }); | ||
54 | + | ||
55 | + // 값이 유효한지 확인하는 함수 정의 | ||
56 | + var validatePresenceOf = function(value) { | ||
57 | + return value && value.length; | ||
58 | + }; | ||
59 | + | ||
60 | + // 저장 시의 트리거 함수 정의 (password 필드가 유효하지 않으면 에러 발생) | ||
61 | + UserSchema.pre('save', function(next) { | ||
62 | + if (!this.isNew) return next(); | ||
63 | + | ||
64 | + if (!validatePresenceOf(this.password)) { | ||
65 | + next(new Error('유효하지 않은 password 필드입니다.')); | ||
66 | + } else { | ||
67 | + next(); | ||
68 | + } | ||
69 | + }) | ||
70 | + | ||
71 | + // 필수 속성에 대한 유효성 확인 (길이값 체크) | ||
72 | + UserSchema.path('id').validate(function (id) { | ||
73 | + return id.length; | ||
74 | + }, 'id 칼럼의 값이 없습니다.'); | ||
75 | + | ||
76 | + UserSchema.path('name').validate(function (name) { | ||
77 | + return name.length; | ||
78 | + }, 'name 칼럼의 값이 없습니다.'); | ||
79 | + | ||
80 | + UserSchema.path('hashed_password').validate(function (hashed_password) { | ||
81 | + return hashed_password.length; | ||
82 | + }, 'hashed_password 칼럼의 값이 없습니다.'); | ||
83 | + | ||
84 | + | ||
85 | + // 스키마에 static 메소드 추가 | ||
86 | + UserSchema.static('findById', function(id, callback) { | ||
87 | + return this.find({id:id}, callback); | ||
88 | + }); | ||
89 | + | ||
90 | + UserSchema.static('findAll', function(callback) { | ||
91 | + return this.find({}, callback); | ||
92 | + }); | ||
93 | + | ||
94 | + console.log('UserSchema 정의함.'); | ||
95 | + | ||
96 | + return UserSchema; | ||
97 | +}; | ||
98 | + | ||
99 | +// module.exports에 UserSchema 객체 직접 할당 | ||
100 | +module.exports = Schema; | ||
101 | + |
1 | +var Conn = require('../database/database') | ||
1 | var express = require('express') | 2 | var express = require('express') |
2 | -var Conn = require('../database/Connection') | 3 | +var router = express.Router(); |
3 | -var router = express.Router() | ||
4 | 4 | ||
5 | //라우팅 함수 등록 | 5 | //라우팅 함수 등록 |
6 | 6 | ||
7 | router.get('/',function(req,res){ | 7 | router.get('/',function(req,res){ |
8 | + | ||
8 | res.render('login.html') | 9 | res.render('login.html') |
9 | }); | 10 | }); |
10 | 11 | ||
... | @@ -15,45 +16,90 @@ router.post('/process', function(req, res) { | ... | @@ -15,45 +16,90 @@ router.post('/process', function(req, res) { |
15 | var paramPassword = req.body.password || req.query.password; | 16 | var paramPassword = req.body.password || req.query.password; |
16 | //GET, POST 모두 고려해서 둘 다 검사 | 17 | //GET, POST 모두 고려해서 둘 다 검사 |
17 | 18 | ||
18 | - if(Conn.pool){ | 19 | + // 데이터베이스 객체 참조 |
19 | - Conn.authUser(paramId, paramPassword, function(err, rows) { | 20 | + var database = req.app.get('database'); |
20 | - if(err){ | 21 | + |
21 | - console.error(err.stack); | 22 | + // 데이터베이스 객체가 초기화된 경우, authUser 함수 호출하여 사용자 인증 |
22 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 23 | + if (database.db) { |
23 | - res.write('<h1>로그인 중 오류</h1>'); | 24 | + authUser(database, paramId, paramPassword, function(err, docs) { |
24 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | 25 | + // 에러 발생 시, 클라이언트로 에러 전송 |
25 | - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); | 26 | + if (err) { |
26 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | 27 | + console.error('사용자 로그인 중 에러 발생 : ' + err.stack); |
27 | - res.end(); | 28 | + |
28 | - | 29 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); |
29 | - return; | 30 | + res.write('<h2>사용자 로그인 중 에러 발생</h2>'); |
31 | + res.write('<p>' + err.stack + '</p>'); | ||
32 | + res.end(); | ||
33 | + | ||
34 | + return; | ||
30 | } | 35 | } |
31 | - if (rows){ | 36 | + |
32 | - console.dir(rows); | 37 | + // 조회된 레코드가 있으면 성공 응답 전송 |
33 | - | 38 | + if (docs) { |
34 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 39 | + console.dir(docs); |
35 | - res.write('<h1>로그인 성공</h1>'); | ||
36 | - res.write('<div><p>Param name : ' + rows[0].name + '</p></div>'); | ||
37 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | ||
38 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | ||
39 | - res.end(); | ||
40 | - } else { | ||
41 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | ||
42 | - res.write('<h1>로그인 실패.</h1>'); | ||
43 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | ||
44 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | ||
45 | - res.end(); | ||
46 | - } | ||
47 | - | ||
48 | - }) | ||
49 | - }else{ | ||
50 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | ||
51 | - res.write('<h1>데이터베이스 연결 실패</h1>'); | ||
52 | - res.end(); | ||
53 | - } | ||
54 | 40 | ||
41 | + // 조회 결과에서 사용자 이름 확인 | ||
42 | + var username = docs[0].name; | ||
43 | + | ||
44 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
45 | + res.write('<h1>로그인 성공</h1>'); | ||
46 | + res.write('<div><p>사용자 아이디 : ' + paramId + '</p></div>'); | ||
47 | + res.write('<div><p>사용자 이름 : ' + username + '</p></div>'); | ||
48 | + res.write("<br><br><a href='/login'>다시 로그인하기</a>"); | ||
49 | + res.end(); | ||
50 | + | ||
51 | + } else { // 조회된 레코드가 없는 경우 실패 응답 전송 | ||
52 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
53 | + res.write('<h1>로그인 실패</h1>'); | ||
54 | + res.write('<div><p>아이디와 패스워드를 다시 확인하십시오.</p></div>'); | ||
55 | + res.write("<br><br><a href='/login'>다시 로그인하기</a>"); | ||
56 | + res.end(); | ||
57 | + } | ||
58 | + }); | ||
59 | + } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송 | ||
60 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); | ||
61 | + res.write('<h2>데이터베이스 연결 실패</h2>'); | ||
62 | + res.write('<div><p>데이터베이스에 연결하지 못했습니다.</p></div>'); | ||
63 | + res.end(); | ||
64 | + } | ||
55 | 65 | ||
56 | }); | 66 | }); |
57 | 67 | ||
68 | +//사용자를 인증하는 함수 : 아이디로 먼저 찾고 비밀번호를 그 다음에 비교하도록 함 | ||
69 | +var authUser = function(database, id, password, callback) { | ||
70 | + console.log('authUser 호출됨.'); | ||
71 | + | ||
72 | + // 1. 아이디를 이용해 검색 | ||
73 | + database.UserModel.findById(id, function(err, results) { | ||
74 | + if (err) { | ||
75 | + callback(err, null); | ||
76 | + return; | ||
77 | + } | ||
78 | + | ||
79 | + console.log('아이디 [%s]로 사용자 검색결과', id); | ||
80 | + console.dir(results); | ||
81 | + | ||
82 | + if (results.length > 0) { | ||
83 | + console.log('아이디와 일치하는 사용자 찾음.'); | ||
84 | + | ||
85 | + // 2. 패스워드 확인 : 모델 인스턴스를 객체를 만들고 authenticate() 메소드 호출 | ||
86 | + var user = new database.UserModel({id:id}); | ||
87 | + var authenticated = user.authenticate(password, results[0]._doc.salt, results[0]._doc.hashed_password); | ||
88 | + if (authenticated) { | ||
89 | + console.log('비밀번호 일치함'); | ||
90 | + callback(null, results); | ||
91 | + } else { | ||
92 | + console.log('비밀번호 일치하지 않음'); | ||
93 | + callback(null, null); | ||
94 | + } | ||
95 | + | ||
96 | + } else { | ||
97 | + console.log("아이디와 일치하는 사용자를 찾지 못함."); | ||
98 | + callback(null, null); | ||
99 | + } | ||
100 | + | ||
101 | + }); | ||
102 | + | ||
103 | +} | ||
58 | 104 | ||
59 | module.exports = router | 105 | module.exports = router |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | var express = require('express') | 1 | var express = require('express') |
2 | -var Conn = require('../database/Connection') | 2 | +var Conn = require('../database/database') |
3 | var router = express.Router() | 3 | var router = express.Router() |
4 | 4 | ||
5 | router.get('/',function(req,res){ | 5 | router.get('/',function(req,res){ |
... | @@ -15,47 +15,66 @@ router.post('/process', function(req, res) { | ... | @@ -15,47 +15,66 @@ router.post('/process', function(req, res) { |
15 | var paramPassword = req.body.password || req.query.password; | 15 | var paramPassword = req.body.password || req.query.password; |
16 | //GET, POST 모두 고려해서 둘 다 검사 | 16 | //GET, POST 모두 고려해서 둘 다 검사 |
17 | 17 | ||
18 | - if(Conn.pool){ | 18 | + // 데이터베이스 객체 참조 |
19 | - Conn.adduser(paramName, paramId, paramPassword, function(err, addedUser) { | 19 | + var database = req.app.get('database'); |
20 | - if(err){ | 20 | + |
21 | - console.error(err.stack); | 21 | + // 데이터베이스 객체가 초기화된 경우, addUser 함수 호출하여 사용자 추가 |
22 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 22 | + if (database.db) { |
23 | - res.write('<h1>ID가 중복되었습니다. 다른 ID를 사용해주세요.</h1>'); | 23 | + addUser(database, paramId, paramPassword, paramName, function(err, addedUser) { |
24 | - res.write('<div><p>Param name : ' + paramName + '</p></div>'); | 24 | + // 동일한 id로 추가하려는 경우 에러 발생 - 클라이언트로 에러 전송 |
25 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | 25 | + if (err) { |
26 | - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); | 26 | + console.error('사용자 추가 중 에러 발생 : ' + err.stack); |
27 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | 27 | + |
28 | - res.end(); | 28 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); |
29 | - | 29 | + res.write('<h2>사용자 추가 중 에러 발생</h2>'); |
30 | - return; | 30 | + res.write('<p>' + err.stack + '</p>'); |
31 | + res.end(); | ||
32 | + | ||
33 | + return; | ||
31 | } | 34 | } |
32 | - if (addedUser){ | 35 | + |
33 | - console.dir(addedUser); | 36 | + // 결과 객체 있으면 성공 응답 전송 |
34 | - | 37 | + if (addedUser) { |
35 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 38 | + console.dir(addedUser); |
36 | - res.write('<h1>회원가입 성공</h1>'); | 39 | + |
37 | - res.write('<div><p>Param name : ' + paramName + '</p></div>'); | 40 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); |
38 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | 41 | + res.write('<h2>사용자 추가 성공</h2>'); |
39 | - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); | 42 | + res.write("<br><br><a href='/login'>다시 로그인하기</a>"); |
40 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | 43 | + res.end(); |
41 | - res.end(); | 44 | + } else { // 결과 객체가 없으면 실패 응답 전송 |
42 | - } else { | 45 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); |
43 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 46 | + res.write('<h2>사용자 추가 실패</h2>'); |
44 | - res.write('<h1>회원가입 실패.</h1>'); | 47 | + res.write("<br><br><a href='/signup'>다시 가입하기</a>"); |
45 | - res.write('<div><p>Param id : ' + paramId + '</p></div>'); | 48 | + res.end(); |
46 | - res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); | 49 | + } |
47 | - res.write("<br><br><a href ='/login'>로그인 페이지로 돌아가기</a>"); | 50 | + }); |
48 | - res.end(); | 51 | + } else { // 데이터베이스 객체가 초기화되지 않은 경우 실패 응답 전송 |
49 | - } | 52 | + res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); |
50 | - | 53 | + res.write('<h2>데이터베이스 연결 실패</h2>'); |
51 | - }) | 54 | + res.end(); |
52 | - }else{ | 55 | + } |
53 | - res.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' }); | 56 | + |
54 | - res.write('<h1>데이터베이스 연결 실패</h1>'); | 57 | +}); |
55 | - res.end(); | ||
56 | - } | ||
57 | 58 | ||
58 | 59 | ||
59 | -}); | 60 | +//사용자를 등록하는 함수 |
61 | +var addUser = function(database, id, password, name, callback) { | ||
62 | + console.log('addUser 호출됨.'); | ||
63 | + | ||
64 | + // UserModel 인스턴스 생성 | ||
65 | + var user = new database.UserModel({"id":id, "password":password, "name":name}); | ||
66 | + | ||
67 | + // save()로 저장 | ||
68 | + user.save(function(err) { | ||
69 | + if (err) { | ||
70 | + callback(err, null); | ||
71 | + return; | ||
72 | + } | ||
73 | + | ||
74 | + console.log("사용자 데이터 추가함."); | ||
75 | + callback(null, user); | ||
76 | + | ||
77 | + }); | ||
78 | +} | ||
60 | 79 | ||
61 | module.exports = router | 80 | module.exports = router |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
... | @@ -12,11 +12,13 @@ | ... | @@ -12,11 +12,13 @@ |
12 | "body-parser": "^1.20.0", | 12 | "body-parser": "^1.20.0", |
13 | "bootstrap": "^5.1.3", | 13 | "bootstrap": "^5.1.3", |
14 | "cookie-parser": "^1.4.6", | 14 | "cookie-parser": "^1.4.6", |
15 | + "crypto": "^1.0.1", | ||
15 | "ejs": "^3.1.7", | 16 | "ejs": "^3.1.7", |
16 | "express": "^4.18.1", | 17 | "express": "^4.18.1", |
17 | "express-error-handler": "^1.1.0", | 18 | "express-error-handler": "^1.1.0", |
18 | "express-session": "^1.17.3", | 19 | "express-session": "^1.17.3", |
19 | "http": "^0.0.1-security", | 20 | "http": "^0.0.1-security", |
21 | + "mongoose": "^6.3.4", | ||
20 | "mysql": "^2.18.1", | 22 | "mysql": "^2.18.1", |
21 | "path": "^0.12.7", | 23 | "path": "^0.12.7", |
22 | "serve-static": "^1.15.0" | 24 | "serve-static": "^1.15.0" | ... | ... |
-
Please register or login to post a comment