2

我正在尝试使用 hapi 和本地护照策略。首先,我试图让“静态”用户工作,然后我计划将用户信息推送到数据库中。我在下面(以及在https://github.com/RyanHirsch/hapi-auth-poc)所拥有的内容将按预期对访问网站的用户进行身份验证,但我无法弄清楚如何正确验证 API 请求。对于测试,我只是尝试使用 cURL 将 GET 连同用户名/密码一起发送,但没有成功登录。

我哪里错了?如何允许使用 hapi 和护照对 API 请求进行凭据处理?

var Hapi = require('hapi');
var LocalStrategy = require('passport-local').Strategy;

var config = {
    hostname: 'localhost',
    port: 8000,
    urls: {
        failureRedirect: '/login'
    },
    excludePaths: ['/public/']
};
var plugins = {
    yar: {
        cookieOptions: {
            password: "worldofwalmart",
            isSecure: false
        }
    },
    travelogue: config // use '../../' instead of travelogue if testing this repo locally
}

var server = new Hapi.Server(config.hostname, config.port);
server.pack.require(plugins, function (err) {
    if (err) {
        throw err;
    }
});

server.auth.strategy('passport', 'passport');

var USERS = {
    "van": "walmart"
};

var Passport = server.plugins.travelogue.passport;
Passport.use(new LocalStrategy(function (username, password, done) {

    // Find or create user here...
    // In production, use password hashing like bcrypt
    if (USERS.hasOwnProperty(username) && USERS[username] == password) {
        return done(null, { username: username });
    }

    return done(null, false, { 'message': 'invalid credentials' });
}));
Passport.serializeUser(function (user, done) {

    done(null, user);
});
Passport.deserializeUser(function (obj, done) {

    done(null, obj);
});

// routes
server.route({
    method: 'GET',
    path: '/',
    config: { auth: 'passport' }, // replaces ensureAuthenticated
    handler: function (request, reply) {

        // If logged in already, redirect to /home
        // else to /login
        reply().redirect('/home');
    }
});

server.route({
    method: 'GET',
    path: '/login',
    config: {
        handler: function (request, reply) {
            if (request.session._isAuthenticated()) {
                reply().redirect('/home');
            } else {
                var form = '<form action="/login" method="post"> <div> <label>Username:</label> <input type="text" name="username"/> </div> <div> <label>Password:</label> <input type="password" name="password"/> </div> <div> <input type="submit" value="Log In"/> </div> </form>';
                reply(form);
            }
        }
    }
});


server.route({
    method: 'GET',
    path: '/home',
    config: { auth: 'passport' },
    handler: function (request, reply) {
        // If logged in already, redirect to /home
        // else to /login
        reply("ACCESS GRANTED<br/><br/><a href='/logout'>Logout</a>");
    }
});

server.route({
    method: 'GET',
    path: '/api/home',
    config: {
        validate: {
            payload: {
                username: Hapi.types.String(),
                password: Hapi.types.String()
            }
        },
        auth: false,
        handler: function (request, reply) {
            // If logged in already, redirect to /home
            // else to /login
            Passport.authenticate('local')(request, function (err) {
                console.log("successful authentication?");
                if (err && err.isBoom) {}
                if(request.session._isAuthenticated()) {
                    reply({message: "logged in"});
                }
            });
            // reply({ "working" : "success" });
        }
    }
});

server.start(function () {
    console.log('server started on port: ', server.info.port);
});
4

2 回答 2

4

您尝试使用通过有效负载提供的用户名和密码验证您的请求,但已将您的操作配置为使用 GET。发生的情况是 Hapi 忽略了您的参数,因此您的请求失败。

只需使用 POST 代替。

作为旁注,使用此方法将使您的 api 依赖于 cookie 和会话,我更喜欢使用“令牌”验证并创建无状态服务。我认为护照持有人对你来说是个不错的选择。

于 2014-04-08T16:27:58.007 回答
1

更简单的解决方案hapi-login:(插件

我们发现Passport 本地策略有点复杂,所以我们创建了一个更简单的选项https : //github.com/dwyl/hapi-login
这是一个Hapi 插件,它创建一个/login端点,您可以在其中POST使用username emailpassword验证人到您的应用程序/网站。

我们为如何使用插件创建了一个分步示例 https ://github.com/dwyl/hapi-login-带有端到端测试 和演示 UI 的示例:https://hapi-login .herokuapp.com/进行验证。

JOI

您将在5 分钟内启动并运行。

还有一个免费的(但单独的)注册插件
https ://github.com/dwyl/hapi-register

我们在我们的 Hapi 应用程序中使用这些并维护它们,因此您不必这样做!
构建状态 编解码器.io 代码气候 依赖状态 dev依赖状态

如果您有任何问题或反馈,请与我们联系

于 2015-11-23T17:32:04.283 回答