-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
159 lines (137 loc) · 4.35 KB
/
index.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
const express = require("express")
const mysql = require("mysql")
const app = express()
const bodyParser = require('body-parser')
const session = require('express-session')
const cookieParser = require('cookie-parser')
const bcrypt = require("bcryptjs")
const port = 3222
const sessionOption = {
// 必須項目(署名を行うために使います)
secret: 'my secret',
// 推奨項目(セッション内容に変更がない場合にも保存する場合にはtrue)
resave: false,
// 推奨項目(新規にセッションを生成して何も代入されていなくても値を入れる場合にはtrue)
saveUninitialized: true,
cookie: {
// 生存期間(単位:ミリ秒)
maxAge: 60 * 60 * 1000,
// クライアント側でJavaScriptなどからアクセスできないようにする場合にはtrue
httpOnly: false
},
// クッキー名(デフォルトでは「connect.sid」)
name: 'my-site-cookie',
// アクセスの度に、有効期限を伸ばす場合にはtrue
rolling: true,
}
app.use(session(sessionOption))
app.use(cookieParser())
app.use(bodyParser.urlencoded({extended: true}))
app.set('view engine', 'ejs')
const connect = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'test',
database: 'test',
port: 3308
})
// View - ユーザー一覧
app.get('/', (req, res) => {
const sql = "select * from users"
connect.query(sql, function (err, result, fields) {
if (err) throw err
res.render('index', {users: result})
})
})
// View - ユーザー情報
app.get('/member', (req, res) => {
// const sql = "select * from users where name"
// connect.query(sql, function (err, result, fields) {
// if (err) throw err
res.render('member', {
session: req.session.user,
cookies: req.cookies['my-site-cookie'],
id: 1
})
// })
})
// API - 新規アカウント作成
app.post('/', (req, res) => {
const sql = "INSERT INTO users (name, password, email, hash_password) VALUES (?,?,?,?)"
const {name, password, email} = req.body
connect.query(sql, [name, password, email, createHashPassword(password)], function (err, result, fields) {
if (err) throw err
// セッションに保存する
req.session.user = req.cookies['my-site-cookie']
res.redirect('/')
})
})
// API - ログイン
app.post('/login', (req, res) => {
const sql = "SELECT * FROM users WHERE email = ?"
connect.query(sql, req.body.email, function (err, result, fields) {
if (err) throw err
if (result.length === 0) {
return forbidden()
}
// パスワードの検証 本来は403エラーページにとばす
const isValidate = validatePassword(req.body.password, result[0].hash_password)
console.log('isValidate', isValidate)
if (isValidate === false) {
return forbidden()
}
req.session.user = req.cookies['my-site-cookie']
console.log('OK 200')
res.redirect('/member')
})
})
// API - ユーザー名の変更(id: 1で固定)
app.post('/user', (req, res) => {
const sql = "UPDATE users SET name = ? WHERE id = ?"
connect.query(sql, [req.body.name, req.body.id], (err, result, fields) => {
if (err) throw err
// req.session.user.name = req.body.name
res.redirect('/member')
})
})
// API - ログアウト
app.get('/logout', (req, res) => {
req.session.destroy()
res.clearCookie('my-site-cookie')
res.redirect('/')
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
/**
* パスワードを検証
* @see https://blog.myntinc.com/2022/01/phppasswordhashpasswordverifynodejs.html
* @param inputPassword
* @param savedPassword
* @returns bool
*/
const validatePassword = (inputPassword, savedPassword) => {
// const len = 11
// パスワードをhash化
// const salt = bcrypt.genSaltSync(len)
// const hash = bcrypt.hashSync(inputPassword, salt)
console.log('inputPassword', inputPassword)
console.log('savedPassword', savedPassword)
return bcrypt.compareSync(inputPassword, savedPassword)
}
/**
* ハッシュ化されたパスワードを生成
* @param pass
* @returns string
*/
const createHashPassword = (pass) => {
const len = 11
// パスワードをhash化
const salt = bcrypt.genSaltSync(len)
return bcrypt.hashSync(pass, salt)
}
const forbidden = (res) => {
return res.status(403).json({
error: {
message: '403 forbidden.'
}
})
}