使用Passport.js、Yeoman和Grunt进行身份验证

4

我正在尝试学习如何在grunt/yeoman中使用passport.js。我有以下内容:

// at the top of my gruntfile.js
var passport = require('passport');
var BasicStrategy = require('passport-http').BasicStrategy;

passport.use(new BasicStrategy(
  function(username, password, done) {
    return done(null, true); // I would expect this to always succeed, but still challenge for credentials
  }
));

// further down in my connect config.
livereload: {
    options: {
        middleware: function (connect) {
            return [
                lrSnippet,
                passport.initialize(),
                passport.authenticate('basic', { session: false }),
                mountFolder(connect, '.tmp'),
                mountFolder(connect, yeomanConfig.app)
            ];
        }
    }
}

每次请求响应只包含 未经授权。删除对 passport.authenticate 的调用使页面正常工作,但显然没有进行身份验证。我尝试改变中间件的顺序,但没有帮助,而且我并不是yeoman/grunt的专家,所以我不太确定还能尝试什么...

非常感谢您的帮助。


您在尝试授权时是否发送了授权标头? - Vadim
@vadim 是的,只要不经过护照,这一切都可以正常工作。 - jonnii
1个回答

0

我认为你需要在BasicStrategy回调函数中传递一个对象给done()。据我所知,passport JS使用这个对象来填充express应用程序中的req.user,因此我认为它可能期望一个对象而不是一个布尔值

这里是我在许多应用程序中使用的同一函数的更强大的示例:

  passport.use(new BasicStrategy(
    function(clientID, clientSecret, done) {
      AuthClient.findOne({ clientID: clientID }, function(err, client) {
        if (err) { return done(err); }
        if (!client) { return done(null, false); }
        if (client.secret != clientSecret) { return done(null, false); }
        return done(null, client);
      });
    }
  ));

正如您所看到的,BasicStrategy 用于分析客户端ID和客户端密钥,这相当于您的用户名/密码组合。由于您实际上并没有像我示例中所示地从数据库中提取它,因此我希望如果您只是按照上面的建议传递 {}done(null, {}),它可能会更好地工作。


扫描源代码,我几乎可以确定用户对象是什么并不重要。代码只验证确保它是真实的,然后将 req.user 设置为您传递的任何内容。 - Vadim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接