passport.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const passport = require('passport');
  2. const LocalStrategy = require('passport-local').Strategy;
  3. const Strategy = require('passport-http-bearer').Strategy;
  4. var jwt = require("jsonwebtoken");
  5. var _ = require('lodash');
  6. var jwt_config = require("config").get("jwt_config");
  7. // 通过登录函数初始化
  8. /**
  9. * 初始化 passport 框架
  10. *
  11. * @param {[type]} app 全局应用程序
  12. * @param {[type]} loginFunc 登录函数
  13. * @param {Function} callback 回调函数
  14. */
  15. module.exports.setup = function(app,loginFunc,callback) {
  16. // 用户名密码 登录策略
  17. passport.use(new LocalStrategy(
  18. function(username, password, done) {
  19. if(!loginFunc) return done("登录验证函数未设置");
  20. loginFunc(username,password,function(err,user) {
  21. if(err) return done(err);
  22. return done(null, user);
  23. });
  24. })
  25. );
  26. // token 验证策略
  27. passport.use(new Strategy(
  28. function(token, done) {
  29. jwt.verify(token, jwt_config.get("secretKey"), function (err, decode) {
  30. if (err) { return done("验证错误"); }
  31. return done(null, decode);
  32. });
  33. }
  34. ));
  35. // 初始化passport模块
  36. app.use(passport.initialize());
  37. if(callback) callback();
  38. };
  39. /**
  40. * 登录验证逻辑
  41. *
  42. * @param {[type]} req 请求
  43. * @param {[type]} res 响应
  44. * @param {Function} next [description]
  45. */
  46. module.exports.login = function(req,res,next) {
  47. passport.authenticate('local', function(err, user, info) {
  48. if(err) return res.sendResult(null,400,err);
  49. if(!user) return res.sendResult(null,400,"参数错误");
  50. // 获取角色信息
  51. var token = jwt.sign({"uid":user.id,"rid":user.rid}, jwt_config.get("secretKey"), {"expiresIn": jwt_config.get("expiresIn")});
  52. user.token = "Bearer " + token;
  53. return res.sendResult(user,200,'登录成功');
  54. })(req, res, next);
  55. }
  56. /**
  57. * token验证函数
  58. *
  59. * @param {[type]} req 请求对象
  60. * @param {[type]} res 响应对象
  61. * @param {Function} next 传递事件函数
  62. */
  63. module.exports.tokenAuth = function(req,res,next) {
  64. passport.authenticate('bearer', { session: false },function(err,tokenData) {
  65. if(err) return res.sendResult(null,400,'无效token');
  66. if(!tokenData) return res.sendResult(null,400,'无效token');
  67. req.userInfo = {};
  68. req.userInfo.uid = tokenData["uid"];
  69. req.userInfo.rid = tokenData["rid"];
  70. next();
  71. })(req, res, next);
  72. }