JWT(JSON Web Token),字面意思很好理解,就是Web的JSON令牌。一種經過Web能夠安全傳遞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" }}
module.exports = { 'network' : { 'port':8080 }, 'jwtsecret': 'myjwttest', 'database': '你的mongo庫連接或者其餘' };
var mongoose = require('mongoose'); var Schema = mongoose.Schema; // 返回一個mongo用戶庫實例 module.exports = mongoose.model('User', new Schema({ name: String, password: String, admin: Boolean //要不要都行 }));
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