Установите ttl для hapi-auth-cookie для определенного маршрута

Я пытаюсь создать страницу входа пользователя с флажком «запомнить меня». Звучит просто, правда?

Когда пользователь входит в систему без установленного флажка «запомнить меня», время жизни сеанса по умолчанию будет установлено на 10 секунд (10000 мс). Однако, если установлен флажок «запомнить меня», время жизни будет установлено на 100000 секунд (100000000 мс).

Пропустив всю проверку подлинности имени пользователя и пароля, я настроил эту небольшую демонстрацию, чтобы проиллюстрировать свои цели. К сожалению, кажется, что ttl сеанса ВСЕГДА составляет 10 секунд и никогда не составляет 100000 секунд.

Вот вставка для приведенного ниже кода: http://pastebin.com/45bRfxkn

var Hapi   = require('hapi');
var AuthCookie = require('hapi-auth-cookie');

var server = new Hapi.Server('localhost',4000); // make a server

// this function is just for my example, I'll use an actual logger later...
function xhrlog(request){
   var auth = request.auth.isAuthenticated ? "Authenticated" : "Not Authenticated";
   console.log(request.method.toUpperCase()+" request to "+request.path+" is "+auth+".");
}

// this is the handler for the '/' route.  You should start at this route first (it represents the login page)
function firstLoad(request, reply){
   xhrlog(request);
   request.auth.session.set({});
   reply("<p style='color:blue'>click the button to test.</p><input type='button' id='foo' value='click me'></input><script>document.getElementById('foo').addEventListener('click', function(){ window.location = './newLocation'});</script> ");  
}

// this is the page that i would expect to have created a session cookie with a ttl of 100000. But it doesnt.
function authorized(request,reply){
   xhrlog(request);
   reply("<p style='width: 300px;'>This is the authorized page.  I would expect this page to have a session timeout of 100000 seconds.  But it doesnt, it only has 10 seconds.  Keep refreshing to see if you are still alive!</p>");
}

// set up the unauthenticated route here. this is the "login" page.
server.route({
   method:'GET',
   path:'/',
   config: {
      handler: firstLoad
   }
});

server.pack.register(AuthCookie, function(err){

   // set up strategy for the session cookie.  It defaults to 10000 ms
   server.auth.strategy('session', 'cookie', {
      password: 'secret',
      cookie: 'iDontKnowWhatThisIsFor',
      redirectTo: '/',
      isSecure: false,
      ttl: 10000
   });

   // set up the route for the 'remember me' page.  It should have a ttl of 100000000 ms.
   server.route({
      method: 'GET',
      path: '/newLocation',
      config: {
         handler: authorized,
         auth: {
            mode: 'try',
            strategy: 'session'
         },
         plugins: { 'hapi-auth-cookie' : { ttl: 100000000 }}  
      }
   });
});

person bberry    schedule 29.07.2014    source источник


Ответы (2)


Вы можете установить разные значения ttl в ответном интерфейсе. Это значение ttl переопределяет значение ttl файла cookie сеанса по умолчанию.

reply("test").state("session", session, {ttl: 365 * 30 * 7 * 24 * 60 * 60 * 1000});
person ubaltaci    schedule 04.08.2014

В случае, если кто-то окажется здесь, похоже, ответ будет другим с текущей версией hapi-auth-cookie. Я попытался использовать принятый ответ, но это не изменит значение ttl для конкретного маршрута.

Согласно документации API: request.cookieAuth.ttl(milliseconds) переопределит настройки стратегии по умолчанию. Хотя это не четко задокументировано, вы также можете передать значение null и установить для файла cookie значение Session в браузере. Мне удалось успешно переопределить настройку ttl, учитывая ситуацию, аналогичную исходному плакату.

Однако большинство современных браузеров в конечном итоге сохраняют файл cookie из-за сохранения вкладок браузера и т. Д. Для повторного открытия. Я бы порекомендовал установить ttl на что-то меньше дня, если вы хотите быть уверенным, что срок действия файла cookie истечет. Не идеальное решение для эквивалентности ожидаемому поведению сеанса

См. пример фрагмента кода:

if (response.login) {
var session = { sid: response.sid};
request.cookieAuth.set(session);
// check if login form had remember me checkbox selected
if(request.payload.remember) {
  return reply.redirect(request.query.next); //uses default strategy ttl setting for cookie
}else{
  request.cookieAuth.ttl(24*60*60*1000); // override ttl to 24 hours
  return reply.redirect(request.query.next);
}
}
person DMO    schedule 20.11.2016