iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Modern Web

MERN Stack + Tailwind CSS - React 小專案實踐計畫系列 第 24

【Day 24】註冊 / 登入 Authentication(2) - 處理後端驗證

  • 分享至 

  • xImage
  •  

上一篇先將頁面基本功能建立好了,現在就要來處理最麻煩的後端驗證了~

建立 user 的 controllr, model, route 檔案

  1. userModel.js

簡單定義一下,(select: false 代表回傳資料時不會顯示 password 這個欄位的資料)

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        required: true,
        unique: true,
        lowercase: true,
    },
    photo: String,
    password: {
        type: String,
        required: true,
        minlength: 8,
        select: false,
    },
});

const User = mongoose.model('User', userSchema);

module.exports = User;
  1. userController.js

接著建立 register 以及 login ,目前先將基本功能寫上來,之後再修正:

  • register 傳入 name, email, password 來建立使用者到資料庫中
  • login 使用 Model.findOne() 來尋找 email 對應的使用者
const User = require('../models/userModel');

exports.register = async (req, res) => {
    try {
        const user = await User.create({
            name: req.body.name,
            email: req.body.email,
            password: req.body.password,
        });
        res.json({
            status: 'success',
            data: {
                user,
            },
        });
    } catch (err) {
        console.log(err);
        res.json({
            status: 'error',
        });
    }
};

exports.login = async (req, res) => {
    const { email, password } = req.body;

    try {
        const user = await User.findOne({ email });
        res.json({
            status: 'success',
            data: {
                user,
            },
        });
    } catch (err) {
        console.log(err);
        res.json({
            status: 'error',
        });
    }
};

試著使用註冊然後登入的結果會是這樣

https://ithelp.ithome.com.tw/upload/images/20221009/2015250206t4d87kPR.png

  1. userRoutes.js

然後再定義路徑及相應的 controller

const express = require('express');
const userController = require('../controllers/userController');

const router = express.Router();

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

module.exports = router;
  1. index.js

記得在 index.js 中也要加上 route 的基本路徑

const userRouter = require('./routes/userRoutes');

app.use('/api/v1/users', userRouter);

安裝 bcryptjs 套件

yarn add bcryptjs

接著將使用者的密碼經過「加密處理」再存進資料庫中!

https://ithelp.ithome.com.tw/upload/images/20221009/201525022I7Aemjxx8.png

bcrypt 會幫我們產生一段字串,這樣就能避免將密碼暴露在資料中了

https://ithelp.ithome.com.tw/upload/images/20221009/20152502KxpCZFCR0O.png

安裝 jsonwebtoken 套件

yarn add jsonwebtoken

然後來處理使用者登入後會產生的驗證 token 字串

  • .select(’+password’) → 取得 user 的 password 資料
  • bcrypt.compare(password, user.password) → 比對使用者的密碼是否正確
  • jwt.sign() → 產生 token,傳入 payload 及 secret,這邊以物件格式的使用者 email 作為 payload,另外在 .env 中定義一個 JWT_SECRET 字串來作為自訂密鑰(可以任意輸入一個字串)

https://ithelp.ithome.com.tw/upload/images/20221009/20152502dJ30YfZLed.png

這樣在登入成功時,就能得到使用者的驗證 token 了

https://ithelp.ithome.com.tw/upload/images/20221009/20152502uBahKgjO2h.png

目前差不多就完成簡易的註冊登入功能啦~~~ 接下來就是處理前端的部分了


上一篇
【Day 23】註冊 / 登入 Authentication(1) - 建立頁面
下一篇
【Day 25】註冊 / 登入 Authentication(3) - 前端功能
系列文
MERN Stack + Tailwind CSS - React 小專案實踐計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言