最近在用node做后台的登錄,檢測登錄功能。在本地使用session可以成功,但是放服務器后發現session失效了,每次請求session都會變化,着了很久原因。原來,自己項目是前后端分離的,前端調用后端api接口,因此使用
cors = require('cors')
來解決了跨域問題,而跨域對於cookie來說,就是兩個不同的網站,因此session會不停的變。
起因
最近在用node做后台的登錄,檢測登錄功能。在本地使用session可以成功,但是放服務器后發現session失效了,每次請求session都會變化,着了很久原因。原來,自己項目是前后端分離的,前端調用后端api接口,因此使用cors = require('cors')
來解決了跨域問題,而跨域對於cookie來說,就是兩個不同的網站,因此session會不停的變。
解決方法
- 設置一個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