-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.js
41 lines (40 loc) · 1.13 KB
/
store.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const crypto = require('crypto')
const knex = require('knex')(require('./knexfile'))
module.exports = {
createUser({ username, password }) {
console.log(`Add user ${username}`)
const { salt, hash } = saltHashPassword({ password })
return knex('user').insert({
salt,
encrypted_password: hash,
username
}).debug()
},
authenticate({ username, password }) {
console.log(`Authenticating user ${username}`)
return knex('user').where({ username })
.then(([user]) => {
if (!user) return { success: false }
const { hash } = saltHashPassword({
password,
salt: user.salt
})
return { success: hash === user.encrypted_password }
})
}
}
function saltHashPassword({
password,
salt = randomString()
}) {
const hash = crypto
.createHmac('sha512', salt)
.update(password)
return {
salt,
hash: hash.digest('hex')
}
}
function randomString() {
return crypto.randomBytes(4).toString('hex')
}