--- lib/user.js
+++ lib/user.js
... | ... | @@ -22,6 +22,16 @@ |
22 | 22 |
return row |
23 | 23 |
} |
24 | 24 |
|
25 |
+async function getByEmail(email) { |
|
26 |
+ await sequelize.sync() |
|
27 |
+ const row = await User.findOne({ |
|
28 |
+ where: { |
|
29 |
+ email: email, |
|
30 |
+ }, |
|
31 |
+ }) |
|
32 |
+ return row |
|
33 |
+} |
|
34 |
+ |
|
25 | 35 |
async function findAll() { |
26 | 36 |
await sequelize.sync() |
27 | 37 |
const rows = await User.findAll() |
... | ... | @@ -60,6 +70,7 @@ |
60 | 70 |
module.exports = { |
61 | 71 |
create, |
62 | 72 |
get, |
73 |
+ getByEmail, |
|
63 | 74 |
findAll, |
64 | 75 |
update, |
65 | 76 |
remove, |
+++ lib/utils
... | ... | @@ -0,0 +1,25 @@ |
1 | +const bcrypt = require('bcryptjs') | |
2 | + | |
3 | +async function hashPassword(password) { | |
4 | + const hashed = await hashPasswordInner(password) | |
5 | + return hashed; | |
6 | +} | |
7 | + | |
8 | +function hashPasswordInner(password) { | |
9 | + const saltRounds = 10 | |
10 | + return new Promise((resolve, reject) => { | |
11 | + bcrypt.hash(password, saltRounds, function (err, hash) { | |
12 | + if (err) reject(err) | |
13 | + resolve(hash) | |
14 | + }) | |
15 | + }) | |
16 | +} | |
17 | + | |
18 | +async function comparePassword(password, hash) { | |
19 | + return await bcrypt.compare(password, hash) | |
20 | +} | |
21 | + | |
22 | +module.exports = { | |
23 | + hashPassword, | |
24 | + comparePassword, | |
25 | +} |
--- routes/apis.js
+++ routes/apis.js
... | ... | @@ -35,7 +35,7 @@ |
35 | 35 |
}) |
36 | 36 |
|
37 | 37 |
router.post('/bookmark', async function (req, res) { |
38 |
- let data = req.body |
|
38 |
+ let data = { pathname: req.body.pathname, userId: req.session.userId } |
|
39 | 39 |
await bookmark.create(data) |
40 | 40 |
res.json({ |
41 | 41 |
status: 200, |
--- routes/user.js
+++ routes/user.js
... | ... | @@ -142,9 +142,9 @@ |
142 | 142 |
const password = req.body.password |
143 | 143 |
try { |
144 | 144 |
const result = await user_service.doLogin({ email, password }) |
145 |
- if (result) { |
|
145 |
+ if (result.id) { |
|
146 | 146 |
req.session.user = email |
147 |
- console.log(req.session.user) |
|
147 |
+ req.session.userId = result.id |
|
148 | 148 |
res.json({ status: 'ok', msg: 'login success' }) |
149 | 149 |
return |
150 | 150 |
} else { |
--- services/user-service.js
+++ services/user-service.js
... | ... | @@ -3,18 +3,7 @@ |
3 | 3 |
const knex = require('../lib/knex') |
4 | 4 |
const mail = require('../lib/mail') |
5 | 5 |
const { v4: uuidv4 } = require('uuid') |
6 |
-const bcrypt = require('bcryptjs') |
|
7 |
-const { send } = require('../lib/aws-ses') |
|
8 |
- |
|
9 |
-function hashPassword(password) { |
|
10 |
- const saltRounds = 10 |
|
11 |
- return new Promise((resolve, reject) => { |
|
12 |
- bcrypt.hash(password, saltRounds, function (err, hash) { |
|
13 |
- if (err) reject(err) |
|
14 |
- resolve(hash) |
|
15 |
- }) |
|
16 |
- }) |
|
17 |
-} |
|
6 |
+const { hashPassword, comparePassword } = require('../lib/utils') |
|
18 | 7 |
|
19 | 8 |
module.exports = { |
20 | 9 |
signupByGitHub: async function (github) { |
... | ... | @@ -57,39 +46,6 @@ |
57 | 46 |
email: email.trim(), |
58 | 47 |
uuid, |
59 | 48 |
}) |
60 |
- }, |
|
61 |
- signupByEmail_: async function (email) { |
|
62 |
- // check duplication |
|
63 |
- try { |
|
64 |
- const result = await knex.raw(`select email from user where email = ?`, [ |
|
65 |
- email.trim(), |
|
66 |
- ]) |
|
67 |
- if (result[0].length > 0) { |
|
68 |
- throw new Error('duplicate email') |
|
69 |
- } |
|
70 |
- |
|
71 |
- // check recent |
|
72 |
- const sql_recent = `select count(*) as cnt |
|
73 |
- from user_candidate |
|
74 |
- where email = ? and finish = 'N' |
|
75 |
- and timediff(now(), createdAt) < '00:05:00';` |
|
76 |
- const result_recent = await knex.raw(sql_recent, [email.trim()]) |
|
77 |
- if (result_recent[0][0]['cnt'] > 0) { |
|
78 |
- throw new Error('email sent already') |
|
79 |
- } |
|
80 |
- |
|
81 |
- // generate uuid |
|
82 |
- const uuid = uuidv4() |
|
83 |
- const url = process.env.BASE_URL |
|
84 |
- await this.sendGuideMail(url, uuid, email) |
|
85 |
- |
|
86 |
- // save sending info |
|
87 |
- const res = await user_candidate.create(email, uuid) |
|
88 |
- return res |
|
89 |
- } catch (error) { |
|
90 |
- console.error(error) |
|
91 |
- throw error |
|
92 |
- } |
|
93 | 49 |
}, |
94 | 50 |
sendGuideMail: async function (uuid, email) { |
95 | 51 |
const url = process.env.BASE_URL |
... | ... | @@ -158,13 +114,16 @@ |
158 | 114 |
}, |
159 | 115 |
|
160 | 116 |
doLogin: async ({ email, password }) => { |
161 |
- const query = `select id, passwd from users where email = ?` |
|
162 |
- const result = await knex.raw(query, [email]) |
|
163 |
- if (result[0].length === 0) { |
|
117 |
+ const result = await user.getByEmail(email) |
|
118 |
+ if (!result.dataValues.id) { |
|
164 | 119 |
throw new Error('등록되지 않은 사용자입니다.') |
165 | 120 |
} |
166 |
- const hashedPassword = result[0][0].passwd |
|
167 |
- return bcrypt.compare(password, hashedPassword) |
|
121 |
+ const isOk = await comparePassword(password, result.dataValues.passwd) |
|
122 |
+ if (isOk) { |
|
123 |
+ return result.dataValues |
|
124 |
+ } else { |
|
125 |
+ throw new Error('비밀번호가 일치하지 않습니다.') |
|
126 |
+ } |
|
168 | 127 |
}, |
169 | 128 |
resetPassword: async (email) => { |
170 | 129 |
// generate uuid |
--- tests/user.test.js
+++ tests/user.test.js
... | ... | @@ -1,4 +1,5 @@ |
1 | 1 |
const user = require('../lib/user') |
2 |
+const { hashPassword, comparePassword } = require('../lib/utils') |
|
2 | 3 |
const randomEmail = require('random-email')({ domain: 'okdevtv.com' }) |
3 | 4 |
const userData = { |
4 | 5 |
email: randomEmail, |
... | ... | @@ -19,6 +20,17 @@ |
19 | 20 |
expect(row.email).toBe(userData.email) |
20 | 21 |
user.remove(result.dataValues.id) |
21 | 22 |
}) |
23 |
+ |
|
24 |
+ it('login', async () => { |
|
25 |
+ const hashed = await hashPassword('okpassokpass'); |
|
26 |
+ userData.passwd = hashed; |
|
27 |
+ const result = await user.create(userData) |
|
28 |
+ const row = await user.get(result.dataValues.id) |
|
29 |
+ const compare = await comparePassword('okpassokpass', row.passwd) |
|
30 |
+ expect(compare).toBe(true) |
|
31 |
+ |
|
32 |
+ user.remove(result.dataValues.id) |
|
33 |
+ }) |
|
22 | 34 |
}) |
23 | 35 |
|
24 | 36 |
module.exports = userData |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?