node使用JsonWebToken 生成token,完成用戶登錄、登錄檢測


最近在用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM