# 第六週講義:JWT 身份驗證機制
## 補充內容
* [線上範例程式碼](https://github.com/gonsakon/express-week4-sample)
* [JWT 官網](https://jwt.io/)
* [JWT 圖解](https://whimsical.com/jwt-UKUY1rj1vfoN6uyic7e4Sm@2Ux7TurymNEtgWEBxMsZ)
* [base64 解碼](https://www.convertstring.com/zh_TW/EncodeDecode/Base64Decode)
## 使用到的 NPM
* [bcryptjs](https://www.npmjs.com/package/bcryptjs):密碼加解密
* [validator](https://www.npmjs.com/package/validator):使用者資料驗證
* [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback):JWT 產生與驗證
```=javascript
<!-- 密碼加密 -->
bcrypt.hash(password,12)
<!-- 密碼比較是否一致 -->
bcrypt.compare(password1, password1)
<!-- 密碼是否有大於 8 碼 -->
validator.isLength(password,{min:8})
<!-- 是否為 Email 格式 -->
validator.isEmail(email)
<!-- 產生 JWT token:payload、secret、option -->
jwt.sign({id:user._id},secret,{
expiresIn: "90d"
})
// output:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYyNDk0NzUzMzI4OTMzMDM0NmYxMDkyNCIsImlhdCI6MTY0ODk2OTU1NSwiZXhwIjoxNzEyMDQxNTU1fQ.bjUj8QgQao6pgFE1MMzZeiD4q0d-VJN0a5CznJr4ZnE
<!-- 解密 JWT -->
jwt.verify(token, secretOrPublicKey, [options, callback])
// output
{
"id": "6249368f98f7f965568ad019",
"iat": 1648968184,
"exp": 1712040184
}
```
## 流程
1. 建立 user model
2. 簡易取得、新增 user 流程
3. 密碼加密
4. 建立 sign_up 註冊、產生 JWT 流程
5. 登入流程
6. 設計 isAuth 的 middleware
7. 觀看 get 個人資訊,並加入 isAuth 的 middleware
8. 更新個人密碼
9. 抽出 auth.js 的 js module