node後端生成token及驗證
阿新 • • 發佈:2022-05-18
// 首先是引入jsonwebtoken和生成token用的key(安全起見,存放在了系統環境變數TOKEN_KEY中) const jwt = require("jsonwebtoken"); const jwtKey = process.env.TOKEN_KEY; ...... // 使用者登陸正確時,伺服器生成並返回token app.post('/login', (req,res) => { const {username, password} = req.body; // 此處理省略從資料庫獲取使用者名稱及密碼資訊,直接進行比對 if(username === database.username && password === database.password) { // 使用者登陸成功後跳轉到其它頁面時,無須再次輸入使用者名稱及密碼等了,所以此處理伺服器會生成併發送給使用者一個token jwt.sign( { username,... } // 除了pwd jwtKey, { expiresIn: '30s' }, // 定義失效時間為30s (err, token) => { res.json({username, message:"登陸成功...", token}) } ) } }) ...... // 此時前端拿到token後,可以將這個token存放到cookie或者authorization頭部,方便再次傳送請求時攜帶 // 此處理以放在authorization為例繼續進行下一步的請求回覆,以afterlogin為例 app.get('/afterlogin',(req,res)=>{ // 既然派發了token,那麼就要在使用者發起請求時先進行解析這個頭部的token const headers = req.headrs; const token = headers['authorization'].split(' ')[1]; // 真正的token是在Bearer 後面的部分 jwt.verify(token, jwtKey, (err, payload)=>{ // 驗證成功的話,會得到真正的負載內容payload if(err) res.sendStatus(403); // 解析token錯誤的話,即驗證錯誤時,返回403 // 如果解析正確的話,繼續走下面的程式 res.json({message: '認證成功!',payload}) // 此處舉例,但沒有必要返回這個負載內容payload }) })