iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

用 Node.js 打造後端 API系列 第 15

Day 15 - Route保護機制

  • 分享至 

  • xImage
  •  

前言


昨天我們完成了jwt的實作,使用者在註冊和登入後都能得到一組token
使用者需要附上這一組token才能新增、刪除bootcamp或course

設定Bearer Token


在Postman Tests設定:

pm.environment.set("TOKEN", pm.response.json().token);

就能將server回傳的token設定在TOKEN這個變數中
如果要在送出request時附上token, 需要在Authorization Type選擇Bearer Token

實作route保護機制


新增auth.js middleware
使用者需要在request header設定Authorization&Bearer "token value"的key value pair
這樣Postman才會將token儲存至環境變數

exports.protect = asyncHandler(async (req, res, next) => {
let token;

if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
  token = req.headers.authorization.split(' ')[1];
}

// 確定token存在
if (!token) {
  return next(new ErrorResponse('Not authorize to access this route', 401));
}

// 驗證token
const decoded = jwt.verify(token, process.env.JWT_SECRET);

req.user = await User.findById(decoded.id);

next();
});

token驗證通過後,會回傳一個object:
https://ithelp.ithome.com.tw/upload/images/20220923/20151654BwHT9wU8uP.png
利用id找到db中的user document並將其assign至req.user
之後要pass給authorize middleware作使用者role的驗證

驗證Role


還記得在Day13建立user schema時
有設定role type的預設值為user吧
為了不讓任何人都能輕易更動db的資料
我們只允許publisher&admin這兩個role能修改db資料
在auth.js middleware中新增函式:

exports.authorize = (...roles) => {
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return next(
        new ErrorResponse(
          `User role ${req.user.role} is not authorized to access this route`,
          403
        )
      );
    }
    next();
  }
}

req.user指的是protect函示中找到的user
所以在route file插入middleware的順序如下:

router.route('...')
  .put(protect, authorize('publisher', 'admin'), updateCourse)
  .delete(protect, authorize('publisher', 'admin'), deleteCourse);

上一篇
Day 14 - JSON Web Token
下一篇
Day 16 - 管理Bootcamp&Course的所有權
系列文
用 Node.js 打造後端 API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言