【问题标题】:Hapijs session in routers路由器中的 Hapijs 会话
【发布时间】:2015-11-04 21:40:09
【问题描述】:

有没有办法使用会话信息,在用户成功登录时从数据库中加载用户数据,跨越 Hapijs 服务器路由中的不同路由?

索引.js

var Hapi = require('hapi');
var server = new Hapi.Server();

var routeManager = require('./routes/manager');
server.connection({ host: "localhost", port: 8000 });

server.register(require('hapi-auth-cookie'), function (err) {
    server.auth.strategy('base', 'cookie', {
        password: 'somesecret',
        cookie: 'app-cookie',
        isSecure: false
    });
});

server.route(routeManager.loginRoutes);

server.start(function(){
    console.log('application started running on: '+JSON.stringify(server.info.uri));
});`

manager.js

`var users = {
    john: {
        id: 'john',
        password: 'pass',
        name: 'John Doe',
        scope: "admin"
    }
};

var loginRoutes = [
    {
        method: 'GET',
        path: '/',
        config: {
            auth: false,
            handler: function homePageHandler(request, reply) {
                return reply('Home Page');
            }
        }
    },
    {
        method: ['GET', 'POST'],
        path: '/login/{user}',
        config: {
            auth: false,
            handler: function(request, reply){
                if(request.params.user === users[request.params.user].id) {
                    request.auth.session.set(users[request.params.user]);
                    console.log("login auth info: "+JSON.stringify(request.auth))
                    reply("Hello, "+users[request.params.user].name);
                }
            }
        }
    },
    {
        method: ['GET', 'POST'],
        path: '/logout/{user}',
        config: {
            auth: {
                strategy: 'base'
            },
            handler: function(request, reply){
                console.log("logout auth info: "+JSON.stringify(request.auth))
                request.auth.session.clear();
                return reply("You are logged out");
            }
        }
    }
];

exports.loginRoutes = loginRoutes;`

【问题讨论】:

    标签: javascript node.js authentication session-cookies hapijs


    【解决方案1】:

    我建议你使用hapi-auth-cookie

    在您的应用设置中,您可以像这样配置它:

    server.register(require('hapi-auth-cookie'), function (err) {
        if (err) {
            console.error(err);
        }
        server.auth.strategy('session', 'cookie', {
            password: 'aReallyBigSecret',
            cookie: 'sid-ws',
            redirectTo: '/login',
            isSecure: false
        });
    });
    

    然后在您的路由中,您可以将它们配置为使用身份验证:

    method: 'GET',
    path: '/aRoute',
    handler: function (request, reply) {
        console.log('request.auth.credentials');
    },
    config: {
        auth: 'session'
    }
    

    要最初创建会话,您需要以某种方式为会话设置一些数据:

    method: 'POST',
    path: '/sessions',
    handler: function (request, reply) {
        var account = {id: 'userId', username:"hapiUser", accountType:"admin"};
        request.auth.session.set(account);
        return reply(account);
    }
    

    这显然不安全;您需要对某种数据库进行某种查找以实际验证您的用户。

    【讨论】:

    • 是否可以在会话中设置自定义值。比如 {username:"hapiUser", accountType:"admin"} ?
    • 我已经用一个简单的POST /sessions 选项更新了我的答案
    • 我理解这一点以及数据库查找的部分。然而,在尝试使用类似方法时,我发现会话没有被数据填满。这是一个示例 - {"isAuthenticated":true,"credentials":{"id":"hapi","password":"pass","name":"Hapi User","accountType":"admin"} ,"artifacts":{"id":"hapi","password":"pass","name":"Hapi User","accountType":"admin"},"session":{},"mode" :"try","strategy":"session"}
    • 你试过request.auth.session.set(key, value)吗?
    • 是的,我试过但失败了。我无法设置会话值。你能把一个小的工作sn-p放在这里供参考吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多