使用 hapi-auth-cookie 的身份验证未设置会话
Authentication with hapi-auth-cookie not setting session
我正在尝试使用 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!');
}
};
当我点击登录端点时,它会回复 "Login Successful" 消息,但正如我所说,无法访问其配置中没有 "auth: false" 的其他端点。
任何帮助将不胜感激。
首先检查浏览器是否创建了cookie。在此之后尝试像这样设置 auth 对象:
auth: {mode:'required',strategy:'base'}
其他模式有:试用,可选。如果用户是否通过身份验证无关紧要,请设置为可选。将 required 设置为您只希望经过身份验证的用户访问的端点。
如果您想通过用户角色保护路由,您需要为会话中设置的用户对象设置范围属性:
request.auth.session.set({id: 123, email: 'guest@guest.com', scope:'admin'});
稍后在您设置范围的路由的 auth 对象上:
auth: {scope: ['admin']}
还可以在创建策略时设置 isSecure: false
。这样cookie就发送给了客户端。
我正在尝试使用 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!');
}
};
当我点击登录端点时,它会回复 "Login Successful" 消息,但正如我所说,无法访问其配置中没有 "auth: false" 的其他端点。
任何帮助将不胜感激。
首先检查浏览器是否创建了cookie。在此之后尝试像这样设置 auth 对象:
auth: {mode:'required',strategy:'base'}
其他模式有:试用,可选。如果用户是否通过身份验证无关紧要,请设置为可选。将 required 设置为您只希望经过身份验证的用户访问的端点。
如果您想通过用户角色保护路由,您需要为会话中设置的用户对象设置范围属性:
request.auth.session.set({id: 123, email: 'guest@guest.com', scope:'admin'});
稍后在您设置范围的路由的 auth 对象上:
auth: {scope: ['admin']}
还可以在创建策略时设置 isSecure: false
。这样cookie就发送给了客户端。