node使用JsonWebToken 生成token,完成用戶登錄、登錄檢測
阿新 • • 發佈:2018-08-12
ola pre vue word sin save vat code res 來解決了跨域問題,而跨域對於cookie來說,就是兩個不同的網站,因此session會不停的變。
最近在用node做後臺的登錄,檢測登錄功能。在本地使用session可以成功,但是放服務器後發現session失效了,每次請求session都會變化,著了很久原因。原來,自己項目是前後端分離的,前端調用後端api接口,因此使用
cors = require(‘cors‘)
來解決了跨域問題,而跨域對於cookie來說,就是兩個不同的網站,因此session會不停的變。
起因
最近在用node做後臺的登錄,檢測登錄功能。在本地使用session可以成功,但是放服務器後發現session失效了,每次請求session都會變化,著了很久原因。原來,自己項目是前後端分離的,前端調用後端api接口,因此使用cors = require(‘cors‘)
解決方法
- 設置一個nginx或者什麽別的來做一下轉發,避免跨域。可以弄一個nginx,設置8080,然後app指向3000,api指向1994。
不使用session,而使用token來做api請求
使用token
- 導入模塊
npm install jsonwebtoken
- 後臺生成token並存入數據庫裏
//api.js //登錄 router.post(‘/api/admin/signIn‘,(req, res)=>{ db.User.find({ name: req.body.name,password: req.body.password},(err, docs)=>{ if (err) { res.send(err); return } if(docs.length>0){ let content ={name:req.body.name}; // 要生成token的主題信息 let secretOrPrivateKey="suiyi" // 這是加密的key(密鑰) let token = jwt.sign(content, secretOrPrivateKey, { expiresIn: 60*60*1 // 1小時過期 }); docs[0].token = token //token寫入數據庫 db.User(docs[0]).save(function (err) { if (err) { res.status(500).send() return } res.send({‘status‘:1,‘msg‘:‘登陸成功‘,‘token‘:token,‘user_name‘:req.body.name}) //反給前臺 }) }else{ res.send({‘status‘:0,‘msg‘:‘登錄失敗‘}); } }) })
- 前臺就可以獲得token並存入localStorage了
//signin.vue this.$axios.post(webUrl+‘api/admin/signIn‘, {‘name‘: this.name, ‘password‘: this.password}) .then((response) => { if(response.data.status==1){ localStorage.setItem(‘token‘, response.data.token); localStorage.setItem(‘user_name‘, response.data.user_name); }else{ alert(response.data.msg) } }) .catch((reject) => { console.log(reject) })
- 後臺檢測token
//檢測token
//api.js
router.post(‘/api/admin/checkUser‘,(req, res)=>{
db.User.find({ name: req.body.user_name,token: req.body.token},(err, docs)=>{
if (err) {
res.send(err);
return
}
if(docs.length>0){
let token = req.body.token; // 從body中獲取token
let secretOrPrivateKey="suiyi"; // 這是加密的key(密鑰)
jwt.verify(token, secretOrPrivateKey, function (err, decode) {
if (err) { // 時間失效的時候/ 偽造的token
res.send({‘status‘:0});
} else {
res.send({‘status‘:1});
}
})
}else{
res.send({‘status‘:0});
}
})
})
前臺每次調用checkUser來檢測登錄就可以了,也可以每個接口都傳token,後臺驗證;
最後
大家好,這裏是「 TaoLand 」,這個博客主要用於記錄一個菜鳥程序猿的Growth之路。這也是自己第一次做博客,希望和大家多多交流,一起成長!文章將會在下列地址同步更新……
個人博客:www.yangyuetao.cn
小程序:TaoLand
node使用JsonWebToken 生成token,完成用戶登錄、登錄檢測