今天做註冊功能,重點是資料庫裡不能出現使用者的原始密碼。
今天做的事
新增routes/auth.js,驗證帳號長度(3到20字)和密碼長度(至少6字),用bcrypt.hash雜湊之後才寫入資料庫:
const hash = await bcrypt.hash(password, 10);
db.run('INSERT INTO users (username, password_hash) VALUES (?, ?)', [username, hash], function (err) {
if (err) {
if (err.code === 'SQLITE_CONSTRAINT') {
return res.status(409).json({ message: '這個帳號已經被使用' });
}
return res.status(500).json({ message: '資料庫錯誤' });
}
res.status(201).json({ id: this.lastID, username });
});
用Thunder Client測試註冊後,查詢資料庫會看到這樣的結果:
{ id: 1, username: 'amy', password_hash: '$2b$10$Tth4FAeq...' }
觀察
卡關
註冊完之後,我不知道資料存在哪裡、要怎麼看。查到資料之後又誤把那串password_hash當成測試登入時要輸入的密碼,才搞清楚兩個方向不一樣:註冊是把密碼雜湊後存起來,登入是把輸入的密碼雜湊後去比對,測試時要輸入的永遠是原本的密碼。
心得
看到資料庫裡只有一串亂碼,才真正理解為什麼說連開發者都不應該知道使用者的密碼。