4

我正在尝试研究如何将 passport.js 与 grunt/yeoman 一起使用。我有以下内容:

// 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)
            ];
        }
    }
}

在每个请求上,响应只包含unauthorized. 删除对passport.authenticate使页面工作的调用,但显然现在没有身份验证。我试过改变中间件的顺序,但没有帮助,而且我离 yeoman/grunt 的专家还差得很远,所以我不完全确定还能尝试什么......

任何帮助将不胜感激。

4

1 回答 1

0

我认为您需要将对象传递到回调done()内部。BasicStrategy我记得,passport JS 使用这个对象来填充 express 应用程序中的 req.user ,因此我认为它可能需要一个objectnot a boolean

这是我在许多应用程序中使用的相同功能的一个更强大的示例:

  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, {}),它可能会更好。

于 2014-01-05T07:28:07.137 回答