使用hapi-auth-cookie进行身份验证而不是设置会话

时间:2015-11-22 17:12:35

标签: node.js authentication cookies hapijs

我尝试使用Hapijs及其插件hapi-auth-cookie设置一个简单的身份验证,但即使登录似乎成功(现在它是模拟登录),当我尝试要访问API的其他端点,我仍然会收到未经授权的异常。

这是我的服务器:

server.register([inert, auth], function(err){
  server.auth.strategy('base', 'cookie', {
    password: 'supersecretpassword', // cookie secret
    cookie: 'app-cookie', // Cookie name
    ttl: 24 * 60 * 60 * 1000 // Set session to 1 day
  });

  server.auth.default({
    strategy: 'base'
  });

    server.route(routes.endpoints);
    //Start the server
    server.start(function () {
        console.log('Server running at:', server.info.uri);
    });
}); 

这是我的登录和注销功能:

exports.login = {
    auth: false,
    validate: {
      payload: {
        email: joi.string().email().required(),
        password: joi.string().min(2).max(200).required()
      }
    },
    handler: function(request, reply) {
        if(request.payload.email === 'guest@guest.com' && request.payload.password === 'password') {
          request.auth.session.set({id: 123, email: 'guest@guest.com'});
          return reply('Login Successful');
        } else {
          return reply(boom.unauthorized('Bad email or password'));
        }
  }
};

exports.logout = {
    auth: false,
    handler: function(request, reply) {
      request.auth.session.clear();
      return reply('Logout Successful!');
    }
  };

当我点击登录端点时,它会回复"登录成功"消息,但正如我所说,无法访问其他没有" auth:false"在其配置中。

任何帮助都将深表感谢。

1 个答案:

答案 0 :(得分:3)

首先检查是否在浏览器上创建了cookie。在此之后尝试设置这样的auth对象:

auth: {mode:'required',strategy:'base'}

其他模式包括:尝试,可选。如果用户未经过身份验证并不重要,请设置可选项。将必需设置为您希望仅由经过身份验证的用户访问的端点。

如果要按用户角色保护路由,则需要将scope属性设置为会话中设置的用户对象:

request.auth.session.set({id: 123, email: 'guest@guest.com', scope:'admin'});

稍后在您设置范围的路线的auth对象上:

auth: {scope: ['admin']}

在创建策略时也设置isSecure: false。这样就可以将cookie发送给客户端。