Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Auto logout with Angularjs based on idle user

Is it possible to determine if a user is inactive and automatically log them out after say 10 minutes of inactivity using angularjs?

I was trying to avoid using jQuery, but I cannot find any tutorials or articles on how to do this in angularjs. Any help would be appreciated.

like image 560
user2101411 Avatar asked Oct 03 '13 20:10

user2101411


People also ask

How to auto logout when session expires in AngularJS?

For most apps, you can simply just handle key or mouse events and enable/disable a logout timer appropriately. That said, on the top of my head, a "fancy" AngularJS-y solution is monitoring the digest loop, if none has been triggered for the last [specified duration] then logout.

How do I use NG idle?

The ng-idle is the module, which is required to respond to and handle the idle users in the module. The ng-idle directive displays a warning dialog by using the $uibModal from UI Bootstrap. It will do the countdown for the remaining time until the session gets timed-out.


2 Answers

I wrote a module called Ng-Idle that may be useful to you in this situation. Here is the page which contains instructions and a demo.

Basically, it has a service that starts a timer for your idle duration that can be disrupted by user activity (events, such as clicking, scrolling, typing). You can also manually interrupt the timeout by calling a method on the service. If the timeout is not disrupted, then it counts down a warning where you could alert the user they are going to be logged out. If they do not respond after the warning countdown reaches 0, an event is broadcasted that your application can respond to. In your case, it could issue a request to kill their session and redirect to a login page.

Additionally, it has a keep-alive service that can ping some URL at an interval. This can be used by your app to keep a user's session alive while they are active. The idle service by default integrates with the keep-alive service, suspending the pinging if they become idle, and resuming it when they return.

All the info you need to get started is on the site with more details in the wiki. However, here's a snippet of config showing how to sign them out when they time out.

angular.module('demo', ['ngIdle']) // omitted for brevity .config(function(IdleProvider, KeepaliveProvider) {   IdleProvider.idle(10*60); // 10 minutes idle   IdleProvider.timeout(30); // after 30 seconds idle, time the user out   KeepaliveProvider.interval(5*60); // 5 minute keep-alive ping }) .run(function($rootScope) {     $rootScope.$on('IdleTimeout', function() {         // end their session and redirect to login     }); }); 
like image 87
moribvndvs Avatar answered Oct 05 '22 06:10

moribvndvs


View Demo which is using angularjs and see your's browser log

<!DOCTYPE html> <html ng-app="Application_TimeOut"> <head> <script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script> </head>  <body> </body>  <script>  var app = angular.module('Application_TimeOut', []); app.run(function($rootScope, $timeout, $document) {         console.log('starting run');      // Timeout timer value     var TimeOutTimerValue = 5000;      // Start a timeout     var TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);     var bodyElement = angular.element($document);      /// Keyboard Events     bodyElement.bind('keydown', function (e) { TimeOut_Resetter(e) });       bodyElement.bind('keyup', function (e) { TimeOut_Resetter(e) });          /// Mouse Events         bodyElement.bind('click', function (e) { TimeOut_Resetter(e) });     bodyElement.bind('mousemove', function (e) { TimeOut_Resetter(e) });         bodyElement.bind('DOMMouseScroll', function (e) { TimeOut_Resetter(e) });     bodyElement.bind('mousewheel', function (e) { TimeOut_Resetter(e) });        bodyElement.bind('mousedown', function (e) { TimeOut_Resetter(e) });              /// Touch Events     bodyElement.bind('touchstart', function (e) { TimeOut_Resetter(e) });            bodyElement.bind('touchmove', function (e) { TimeOut_Resetter(e) });              /// Common Events     bodyElement.bind('scroll', function (e) { TimeOut_Resetter(e) });            bodyElement.bind('focus', function (e) { TimeOut_Resetter(e) });          function LogoutByTimer()     {         console.log('Logout');          ///////////////////////////////////////////////////         /// redirect to another page(eg. Login.html) here         ///////////////////////////////////////////////////     }      function TimeOut_Resetter(e)     {         console.log('' + e);          /// Stop the pending timeout         $timeout.cancel(TimeOut_Thread);          /// Reset the timeout         TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);     }  }) </script>  </html> 

Below code is pure javascript version

<html>     <head>         <script type="text/javascript">                      function logout(){                 console.log('Logout');             }              function onInactive(millisecond, callback){                 var wait = setTimeout(callback, millisecond);                                document.onmousemove =                  document.mousedown =                  document.mouseup =                  document.onkeydown =                  document.onkeyup =                  document.focus = function(){                     clearTimeout(wait);                     wait = setTimeout(callback, millisecond);                                        };             }                    </script>     </head>      <body onload="onInactive(5000, logout);"></body> </html> 

UPDATE

I updated my solution as @Tom suggestion.

<!DOCTYPE html> <html ng-app="Application_TimeOut"> <head> <script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script> </head>  <body> </body>  <script> var app = angular.module('Application_TimeOut', []); app.run(function($rootScope, $timeout, $document) {         console.log('starting run');      // Timeout timer value     var TimeOutTimerValue = 5000;      // Start a timeout     var TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);     var bodyElement = angular.element($document);      angular.forEach(['keydown', 'keyup', 'click', 'mousemove', 'DOMMouseScroll', 'mousewheel', 'mousedown', 'touchstart', 'touchmove', 'scroll', 'focus'],      function(EventName) {          bodyElement.bind(EventName, function (e) { TimeOut_Resetter(e) });       });      function LogoutByTimer(){         console.log('Logout');         ///////////////////////////////////////////////////         /// redirect to another page(eg. Login.html) here         ///////////////////////////////////////////////////     }      function TimeOut_Resetter(e){         console.log(' ' + e);          /// Stop the pending timeout         $timeout.cancel(TimeOut_Thread);          /// Reset the timeout         TimeOut_Thread = $timeout(function(){ LogoutByTimer() } , TimeOutTimerValue);     }  }) </script> </html> 

Click here to see at Plunker for updated version

like image 25
Frank Myat Thu Avatar answered Oct 05 '22 06:10

Frank Myat Thu