jwt認證方式在express中的使用

JWT(JSON Web Token),字面意思很好理解,就是Web的JSON令牌。一種經過Web能夠安全傳遞JSON格式信息的機制
  • 裝備package.json包依賴文件
{"dependencies": {
    "body-parser": "^1.17.2",
    "express": "^4.15.3",
    "express-jwt": "^5.3.0",
    "jsonwebtoken": "^7.4.1",
    "mongoose": "^4.10.4",
    "morgan": "^1.8.2"
 }}
  • 配置文件 config.js
module.exports = {
    'network' : {
    'port':8080
  },    
  'jwtsecret': 'myjwttest',
  'database': '你的mongo庫連接或者其餘'
};
  • 數據庫model user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// 返回一個mongo用戶庫實例
module.exports = mongoose.model('User', new Schema({ 
    name: String, 
    password: String, 
    admin: Boolean   //要不要都行
}));
  • 程序的入口文件 app.js
var express     = require('express');
var app         = express();
var bodyParser  = require('body-parser');
var morgan      = require('morgan');
var mongoose    = require('mongoose');
var jwt    = require('jsonwebtoken'); // 使用jwt簽名
var config = require('./config'); // 引入配置
var User   = require('./user'); // 得到mongo用戶庫實例

// mongo數據庫設置
   mongoose.connect(config.database); 
   // 設置superSecret 全局參數
   app.set('superSecret', config.jwtsecret); 
   // 使用 body parser 將post參數及URL參數能夠經過 req.body或req.query 拿到請求參數
   app.use(bodyParser.urlencoded({ extended: false }));
   app.use(bodyParser.json());
   // 使用 morgan 將請求日誌輸出到控制檯
   app.use(morgan('dev'));
   //根路徑處理結果
   app.get('/', function(req, res) {
res.send('JWT 受權訪問的API路徑 http://localhost:' + config.network.port + '/api');
   });
   //開啓服務
app.listen(config.network.port);
console.log('JWT測試服務已經開啓地址: http://localhost:' + config.network.port);
  • 註冊數據

// 在steup 路徑下簡單用戶數據寫入操做,爲了身份驗證,固然也能夠不使用數據庫。web

app.post('/setup', function(req, res) {
    if(req.body.name && req.body.password){  
        var nick = new User({ 
        name: req.body.name, 
        password: req.body.password,
        admin:req.body.admin||false
          }); 
        nick.save(function(err) {
         if (err) throw err;
        console.log('用戶存儲成功');
        res.json({ success: true });
  });}
  else{
      res.json({ success: false,msg:"錯誤參數" });
  }
});
  • 登陸操做

// 用戶受權路徑,返回JWT 的 Token 驗證用戶名密碼數據庫

app.post('/authenticate', function(req, res) {
    User.findOne({
        name: req.body.name
     }, function(err, user) {
        if (err) throw err;
        if (!user) {
          res.json({ success: false, message: '未找到受權用戶' });
        } else if (user) {
           if (user.password != req.body.password) {
            res.json({ success: false, message: '用戶密碼錯誤' });
          } else {
        var token = jwt.sign(user, app.get('superSecret'), {
              expiresIn : 60*60*24// 受權時效24小時
        });
        res.json({
              success: true,
              message: '請使用您的受權碼',
              token: token
        });
      }   
    }
    });
});
  • 驗證中間件
//  localhost:端口號/api 路徑路由定義
var apiRoutes = express.Router();
apiRoutes.use(function(req, res, next) {
    // 拿取token 數據 按照本身傳遞方式寫
    var token = req.body.token || req.query.token || req.headers['x-access-token'];
    if (token) {      
        // 解碼 token (驗證 secret 和檢查有效期(exp))
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {      
              if (err) {
            return res.json({ success: false, message: '無效的token.' });    
              } else {
                // 若是驗證經過,在req中寫入解密結果
                req.decoded = decoded;  
                //console.log(decoded)  ;
                next(); //繼續下一步路由
          }
        });
      } else {
        // 沒有拿到token 返回錯誤 
        return res.status(403).send({ 
            success: false, 
            message: '沒有找到token.' 
        });
      }
    });
  • 測試驗證
//API跟路徑返回內容
apiRoutes.get('/', function(req, res) {
  res.json({ message: req.decoded._doc.name+'  歡迎使用API' });
});
//獲取全部用戶數據
apiRoutes.get('/users', function(req, res) {
  User.find({}, function(err, users) {
res.json(users);
  });
});   
// 註冊API路由
app.use('/api', apiRoutes);

參考:http://www.bleachlei.site/blo...express

相關文章
相關標籤/搜索