首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置passport-jwt身份验证

设置passport-jwt身份验证
EN

Stack Overflow用户
提问于 2015-10-06 04:24:30
回答 1查看 3.3K关注 0票数 2

我在使用我的express应用程序接口服务器设置passport-jwt时遇到了一些问题。

在前端,我使用ember.js/auth路由发送应该对会话进行身份验证的凭据,然后ember.js中的库将处理在后续请求中发送令牌。

我松散地跟踪了this tutorial,并用passport-jwt替换了他们的passport-http,用the git repo设置了它。

在我的server.js中,我需要passport,并使用app.use(passport.initialize());将其设置为中间件

server.js文件的底部,我用app.use('/api/v1', '/app/routes/api');调用了我的api文件

我的app/routes/api.js文件看起来有一个用于添加和获取用户的部分,如下所示

代码语言:javascript
复制
router.route('/users')
  .post(function(req,res) { user.addUser(req,res) })
  .get(function(req,res) { user.getAllUsers(req,res) });

它们是对api/user.js文件中的导出的引用,如下所示

代码语言:javascript
复制
var mongoose = require('mongoose');
var User = require('../../models/user');

module.exports.addUser = function(req, res) {
  var user = new User(req.body.user);

  user.save(function(err) {
    if (err)
      res.send(err);
    res.json({user: user});
  });
};

module.exports.getAllUsers = function(req, res) {
  User.find(function(err, users) {
      if (err) {
        res.send(err);
      }
      res.json({users: users});
  });
};

这个模型非常简单,它尝试在保存密码时散列密码,前提是密码没有更改(我假设这是针对PUT请求的)以及密码验证类方法

代码语言:javascript
复制
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');

var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});

UserSchema.pre('save',function(callback){
    var user = this;

    if(!user.isModified('password')) return callback();

    bcrypt.genSalt(5, function(err, salt){
        if (err) return callback(err);

        bcrypt.hash(user.password, salt, null, function(err, hash){
            if (err) return callback(err);
            user.password = hash;
            callback();
        });
    });
});

UserSchema.methods.verifyPassword = function(password) {
  return bcrypt.compareSync(password, this.local.password);
};

module.exports = mongoose.model('User',UserSchema);

对于我的其他API端点,我从controllers/auth.js传入isAuthenticated方法,如下所示

代码语言:javascript
复制
router.route('/followers')
  .post(authController.isAuthenticated, function(req,res) { follower.addFollower(req,res) })
  .get(authController.isAuthenticated, function(req,res) { follower.getAllFollowers(req,res) });

控制器文件中的导出如下所示

代码语言:javascript
复制
var dotenv = require('dotenv');
dotenv.load();

var passport = require('passport');
var JWTStrategy = require('passport-jwt').Strategy;
var User = require('../models/user');

var opts = {};
opts.secretOrKey = process.env.PASSPORT_SECRET || 'secretsauce';
passport.use(new JWTStrategy(opts, function(jwt_payload, done){
    User.findOne({id: jwt_payload.sub}, function(err, user){
        if (err) {
            return done(err, false);
        }
        if (!user) { return done(null,false); }
        user.verifyPassword(password, function(err,isMatch){
            if (err) { return done(err, false); }
            if(!isMatch) { return done(null,false); }
            done(null, user);
        });
    });
}));

exports.isAuthenticated = passport.authenticate('jwt', { session : false });

我想这就是我在如何向express服务器进行身份验证时感到困惑的地方。我可以添加用户,他们的密码被正确地散列,但我如何实际验证用户。具体地说,我该如何在到/auth路由的POST上授权它们?我正在使用postman来测试API,所以如果有人可以解释一下如何在postman中使用jwt进行测试,那将会很酷。我知道我必须为从身份验证中获得的令牌设置一个头,但我无法理解如何进行身份验证。

EN

回答 1

Stack Overflow用户

发布于 2016-05-09 13:26:24

在您的路由中,您应该包括检查是否存在有效令牌的passport.authenticate函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32957286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档