1. 程式人生 > 其它 >node後端生成token及驗證

node後端生成token及驗證

// 首先是引入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
	})
	
})