我尝试使用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"在其配置中。
任何帮助都将深表感谢。
答案 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发送给客户端。