# 第六週講義: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