※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。
bcryptを用いたハッシュ化
bcrypt というパッケージを用いて、Node.jsでパスワードをハッシュ化し保存します。
例としてusersControllerでサインアップ時にパスワードをハッシュ化します。
bcryptをインストールします。
npm install bcrypt
ハッシュ化を実施するコントローラーでロードします。
以下のようなusresControllerがあるとします。サインアップ時に使用するコントローラーです。
ORMにsequelizeを用いています。
sequelizeについては、こちらをご覧ください。
【Express】ExpressにSequelizeを導入しORMでデーターベースを操作する。(SQLite3)
usersController.js
function signup(req, res) {
db.sequelize.sync()
.then(() => db.User.create({
name: req.body.name,
email: req.body.email,
pass: req.body.password
})).then(usr => {
res.redirect('/home');
})
}
bcryptをロードし、signup関数のpromiseチェーンに、ハッシュ化関数をかまします。
usersController.js
const bcrypt = require('bcrypt'); //bcryptをロード
function signup(req, res) {
db.sequelize.sync()
.then(() => bcrypt.hash(req.body.password, 10))
//ハッシュ化関数をかまします。第二引数はハッシュ化の強度となります。
.then(hashedPassword => db.User.create({
//生成されたハッシュを引数hashedPasswordで受け取ります。
name: req.body.name,
email: req.body.email,
pass: hashedPassword //ハッシュ化されたものを保存します。
})).then(usr => {
res.redirect('/home');
})
}
ログイン時にハッシュ化したパスワードと入力したパスワードを比較する。
function login(req, res) {
db.User.findOne({ where: { email: req.body.email } })
//入力されたemailユーザーを取得。
.then((user) => {
if (!user) {
res.redirect("login");
}
return user; //ユーザーを非同期で返す。
})
.then((user) => {
let resultMatch = bcrypt.compareSync(req.body.password, user.pass);
//bcrypt.compareSync関数で(入力値, ハッシュ化されて保存している値)を比較。
//一致したらtrueを返す。
if (resultMatch) {
res.redirect("/home");
}
res.redirect("login");
})
}