Node express MySql 註冊與登入

註冊

因爲註冊使用到bcryptjs密碼加密功能,
bcrypt加密語法

1
2
3
4
5
6
//引入bcryptjs密碼加密
const bcrypt = require('bcryptjs')

const saltRounds = 10;
const hashPassword = bcrypt.hashSync(密碼, saltRounds)

models.users.js

1
INSERT INTO `users` (column1, column2, column3...) SET (value1, value2, value3...)

token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//bcryptjs密碼加密
const bcrypt = require('bcryptjs')
//載入 jsonwebtoken
const jwt = require('jsonwebtoken')
// 建立使用者
var User = function(newUser){
this.uId = newUser.uId;
this.userName = newUser.userName;
this.userEmail = newUser.userEmail;
this.userPassword = bcrypt.hashSync(newUser.userPassword, 3);//bcrypt.hashSync(newUser.userPassword, 12)
this.userPhone= newUser.userPhone;
this.roleId= newUser.roleId;
this.token = jwt.sign({_id: newUser.uId ,username: newUser.userName,email: newUser.userEmail}, 'RESTFULAPI',{expiresIn: "24h"}).toString();//jwt
this.createdAt= newUser.createdAt;
this.updatedAt= newUser.updatedAt;
this.deletedAt= newUser.deletedAt;
}
User.create = function (newUser, callback) {
db.query('INSERT INTO users SET ?', newUser, callback);
};
module.exports = User;

登入

尋找帳號與密碼驗證 => 內連結的模組資料表的資料內容 (取出modulePermissionId與modulePermissionName 並且新增到menu )
使用資料庫語法:

1
2
3
4

SELECT 顯示欄位 FROM `資料表1` INNER JOIN `資料表2` ON 資料表1uId=資料表2roleId WHERE 資料表1.欄位名 ='';
//例如
SELECT users.id, users.uId, users.userName, users.userEmail, users.userPassword, users.userPhone, users.roleId, users.token ,modulePermissions.modulePermissionId,modulePermissions.modulePermissionName FROM `users` INNER JOIN `modulePermissions` ON users.uId=modulePermissions.roleId WHERE users.userName =?;

登入時必須帳號登入時驗證密碼(bcrypt.compareSync(密碼, 密碼加密))

bcrypt驗證語法

1
bcrypt.compareSync(密碼, 密碼加密)

models.users.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'use strict';

var db = require('../config/database');
//bcryptjs密碼加密
const bcrypt = require('bcryptjs')
//載入 jsonwebtoken
const jwt = require('jsonwebtoken')

User.userName = (userName, result) =>
{
let sql = 'SELECT users.id, users.uId, users.userName, users.userEmail, users.userPassword, users.userPhone, users.roleId, users.token ,modulePermissions.modulePermissionId,modulePermissions.modulePermissionName FROM `users` INNER JOIN `modulePermissions` ON users.uId=modulePermissions.roleId WHERE users.userName =?';
db.query(sql, userName, (err, row, fields) =>
{
if (err) result(err, null,);
result(null, row);
});
};

controllers.users.js

  • bcrypt.hashSync(密碼, SaltRound)
  • bcrypt.compareSync(密碼,加密密碼)
加密後的 bcrypt 分為四個部分:
  • Bcrypt
    該字串為 UTF-8 編碼,並且包含一個終止符
  • Round
    (回合數)每增加一次就加倍雜湊次數,預設10次
  • Salt
    (加鹽)128 bits 22個字元
  • Hash
    (雜湊)138 bits 31個字元
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
const User = require('../models/users');

exports.login = async (req, res, next) =>
{
/*
#swagger.summary='登入',
#swagger.description = '' */

/* #swagger.parameters['body'] = {
in: 'body',
description: '',
required: true,
schema: { $ref: "#/definitions/Login" }
} */

/* #swagger.security = [{
"apiKeyAuth": []
}] */

const userName = req.body.userName;
const userPassword = req.body.userPassword;

try {
//檢查是否有userName 帳號
User.userName(userName, (error, item) =>
{
if (item.length != 0 && bcrypt.compareSync(userPassword, item[0].userPassword) ) {
// console.log('登入item', item)
console.log('登入驗證密碼', bcrypt.compareSync(userPassword, item[0].userPassword))
let menu = [];
// forEach
item.forEach(el => {
let query = {
modulePermissionId: el.modulePermissionId,
modulePermissionName: el.modulePermissionName,
}
menu.push(query)
});
let loginValue = {
userName: item[0].userName,
token: item[0].token,
menu: menu,
}
return res.status(200).json(loginValue);
} else {
return res.status(400).send('沒有userName')
}
})
}
catch (error) {
return res.status(500).json({message: error.message})
}
}
routes/users.js
1
2
3
4
5
var express = require('express');
var router = express.Router();
const userController = require('../controllers/users');

router.post('/login', userController.login);