1. 程式人生 > >nodejs漸入佳境[27]-express+mongodb+middleware實現密碼雜湊

nodejs漸入佳境[27]-express+mongodb+middleware實現密碼雜湊

儲存密碼前對密碼進行hash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

UserSchema.pre('save', function (next) {
 var user = this;

 if (user.isModified('password')) {
   bcrypt.genSalt(10, (err, salt) => {
     bcrypt.hash(user.password, salt, (err, hash) => {
       user.password = hash;

       next();
     });
   });
 } else {
   next();
 }
});

完整程式碼

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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
var mongoose = require('mongoose');
var express = require('express');
var bodyParser = require('body-parser');
const {ObjectID} = require('mongodb');
var _ = require('lodash');

const validator = require('validator');


const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
//app
var app = express();
const port = process.env.PORT || 3000;
//express middleware  Jonson物件與字串轉換。
app.use(bodyParser.json());

//
mongoose.Promise = global.Promise;
//連線mogodb
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/TodoApp');

//模版
var Todo = mongoose.model('Todo',{
   text:{
     type:String,  //型別
     required:true, //必須要有
     minlength:1, //最小長度
     trim:true   //去除空格
   },
   completed:{
     type:Boolean,
     default:false  //預設值
   },
   completedAt:{
     type:Number,
     default:null
   }
});





var UserSchema = new mongoose.Schema({
 email: {
   type: String,
   required: true,
   trim: true,
   minlength: 1,
   unique: true,
   validate: {
     validator: validator.isEmail,
     message: '{VALUE} is not a valid email'
   }
 },
 password: {
   type: String,
   require: true,
   minlength: 6
 },
 tokens: [{
   access: {
     type: String,
     required: true
   },
   token: {
     type: String,
     required: true
   }
 }]
});

UserSchema.methods.toJSON = function () {
 var user = this;
 var userObject = user.toObject();

 return _.pick(userObject, ['_id', 'email']);
};

UserSchema.methods.generateAuthToken = function () {
 var user = this;
 var access = 'auth';
 var token = jwt.sign({_id: user._id.toHexString(), access}, 'abc123').toString();

 user.tokens = user.tokens.concat([{access,token}]);

 return user.save().then(() => {
   return token;  //返回token
 });
};


UserSchema.statics.findByToken = function (token) {
 var User = this;
 var decoded;

 try {
   decoded = jwt.verify(token, 'abc123');
 } catch (e) {
   return Promise.reject();
 }

 return User.findOne({
   '_id': decoded._id,
   'tokens.token': token,
   'tokens.access': 'auth'
 });
};




//在儲存之前執行操作。

UserSchema.pre('save', function (next) {
 var user = this;

//儲存時對於密碼的更新
 if (user.isModified('password')) {
   bcrypt.genSalt(10, (err, salt) => {
     //密碼變為了hash
     bcrypt.hash(user.password, salt, (err, hash) => {
       user.password = hash;
       next();
     });
   });
 } else {
   next();
 }
});


var User = mongoose.model('User', UserSchema);





//auth middlewire

var authenticate = (req, res, next) => {
 var token = req.header('x-auth');

 User.findByToken(token).then((user) => {
   if (!user) {
     return Promise.reject();
   }

   req.user = user;
   req.token = token;
   next();
 }).catch((e) => {
   res.status(401).send();
 });
};



app.get('/users/me', authenticate, (req, res) => {
 res.send(req.user);
});



相關推薦

nodejs漸入佳境[27]-express+mongodb+middleware實現密碼

儲存密碼前對密碼進行hash 123456789101112131415 UserSchema.pre('save', function (next) {  var user = this;  if (user.isModified('password

webpack4+express+mongodb+vue 實現增刪改查

在講解之前,我們先來看看效果如下所示: 1)整個頁面的效果如下: 2) 新增資料效果如下: 3) 新增成功如下: 4) 編輯資料效果如下:   5) 編輯成功效果如下:   6) 刪除資料效果如下:   7) 刪除成功效果如下:

nodejs漸入佳境[15]-express框架

最簡單的伺服器 12345678910111213141516171819202122 const express = require('express');var app = express();//返回html格式app.get('/',(req,res)=>{

密碼學(對稱與非對稱密碼 演算法)

目錄 密碼學 密碼學發展 對稱加密體制 非對稱加密體制 混合加密 雜湊演算法 數字簽名過程 密碼學的應用--網站認證 密碼學 密碼學發展 古典密碼:古代----19世紀末 近代密碼:20世紀初---1949年 現代密碼:1949(夏農

Go語言實現單向函式 —— MD5訊息摘要演算法、SHA256與224(Go語言實現

 MD5訊息摘要演算法 MD5訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。 Go語言實現方式一: packag

密碼值在Oracle 12c資料庫中調整

密碼雜湊值在Oracle 12c資料庫中調整 Simeon 原文連結: https://www.trustwave.com/Resources/SpiderLabs-Blog/Changes-in-Oracle-Database-12c-password-hashes/ Oracle在Oracle

hashmap實現原理(值計算,put方法,擴容) jdk1.8帶來的優化 hashmap併發安全 ConcurrentHashMap

HashMap的原始碼,實現原理,JDK8中對HashMap做了怎樣的優化。 ArrayList和LinkedList的優缺點——陣列的特點是:定址容易,插入和刪除困難;而連結串列的特點是:定址困難,插入和刪除容易。 hashmap底層

三部曲:二:第一部分:C語言實現 靜態

在這個靜態雜湊表中 我們用一個容量為10 的靜態陣列作為雜湊表的底層構造 但是陣列的每一個儲存空間中又分為兩個部分                                 資料區:data                                    

SM3密碼演算法原理

1.概述 SM3是中華人民共和國政府採用的一種密碼雜湊函式標準,由國家密碼管理局於2010年12月17日釋出。相關標準為“GM/T 0004-2012 《SM3密碼雜湊演算法》”。 在商用密碼體系中,SM3主要用於數字簽名及驗證、訊息認證碼生成及驗證、隨機數生成等,其演算

偽隨機生成器具體實現——單向函式

一 點睛 使用單向雜湊函式可以編寫能夠生成具備不可預測性的偽隨機數列(即強偽隨機數)的偽隨機數生成器。 二 工作方式 這種偽隨機數生成器的工作方式如下。 1 用偽隨機數的種子初始化內部狀態(計數器)。 2 用單向雜湊函式計算計數器的雜湊值。 3 將雜湊值作為偽

加鹽密碼:如何正確使用

如果你是Web開發者,你很可能需要開發一個使用者賬戶系統。這個系統最重要的方面,就是怎樣保護使用者的密碼。存放帳號的資料庫經常成為入侵的目標,所以你必須做點什麼來保護密碼,以防網站被攻破時發生危險。最好的辦法就是對密碼進行加鹽雜湊,這篇文章將介紹它是如何做到這點的。 在對密碼進行雜湊加密的問題上,人們

[CareerCup] 8.10 Implement a Hash Table 實現一個

8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions. 這道題讓我們實現一個簡單的雜湊表,我們採用了最簡單的那種取餘映射的方式來實現,我們使用Cell來儲存一對對的

Java 集合:HashMap(put方法的實現衝突)

HashMap 概念 對於 Map ,最直觀就是理解就是鍵值對,對映,key-value 形式。一個對映不能包含重複的鍵,一個鍵只能有一個值。平常我們使用的時候,最常用的無非就是 HashMap。 HashMap 實現了 Map 介面,允許使用 null 值 和 nu

基於Spring實現一致性(consistent hasing)redis快取

目前關於redis叢集方案,官方方案是Redis cluster,Redis3.0以後正式提供。大家可以瞭解下。 雖然官方方案都有,並且網上也有很多關於這方面的內容,為什麼還要自己造輪子。哈哈,程式設計師不久最喜歡造輪子。核心功能已經完成,但是會持續更新的

Javascript實現HashTable(表)

1.雜湊表 ES6特性(詳細可看阮一峰) Set 物件類似於陣列,且成員的值都是唯一的。 Map 物件是鍵值對集合,和 JSON 物件類似,但是 key 不僅可以是字串還可以是物件 其中Map中的鍵名

Java PBKDF2 密碼程式碼 安全性較高的加密

/*   * Password Hashing With PBKDF2 (http://crackstation.net/hashing-security.htm).  * Copyright (c) 2013, Taylor Hornby  * All rights re

Matlab 實現感知

BinToHex.mfunction str=BinToHex(A) str=''; for i=1:8 for j=1:4:8 temp = dec2

java簡單實現一致性演算法

什麼是一致性雜湊演算法 一種特殊的雜湊演算法,這種演算法使得雜湊表、叢集的規模在伸縮時儘可能減少重對映(remap)。為什麼需要它 一致性雜湊基本解決了在P2P環境中最為關鍵的問題——如何在動態的網路拓撲(叢集)中分佈儲存和路由。每個節點僅需維護少量相鄰節點的資訊,並且在節

HahTable——拉鍊法實現

由於雜湊表的查詢高效性,在平時的演算法中用的也是比較多。例如:字串、單詞個數的統計,只出現一次字元或者數字的統計,兩個集合相同元素的查詢等等,還有插入刪除的高效(鏈地址法)都可以用雜湊表來解決。缺點可能是需要佔用額外的記憶體空間。 1 原理分析 處理雜湊衝突

python code practice(二):KMP演算法、二分搜尋的實現

1、替換空格 題目描述:請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 分析: 將長度為1的空格替換為長度為3的“%20”,字串的長度變長。 如果允許我們開闢一個新的陣列來存放替換空格後的字串, 那麼這道