diff --git a/web/app/partials/header.html b/web/app/partials/header.html
index d664e231e2d516525852edaede15030a52b31c77..6d5820ad3bf35b6509c608f1c4369c5969310cd3 100644
--- a/web/app/partials/header.html
+++ b/web/app/partials/header.html
@@ -3,7 +3,7 @@
         <li><a href="">Pular para o conteúdo</a></li>
         <li><a href="">Ouvidoria</a></li>
         <li><a href="">Mapa do site</a></li>
-        <li><a href="" ng-click="login.show()">Acesso Restrito</a></li>
+        <li><a href="" ng-click="login.click()">{{ login.buttomText }}</a></li>
     </ul>
 
     <div class="header-font-size">
diff --git a/web/assets/js/app.js b/web/assets/js/app.js
index ad4238d2474bb72ff42c4b35d8cf30390d6440ec..a75062e30898a84407d56fd98ce0f2ee71c8f9cc 100644
--- a/web/assets/js/app.js
+++ b/web/assets/js/app.js
@@ -31,7 +31,11 @@ angular.module('datasid', ['ngResource', 'ui.router', 'datasid.install', 'datasi
         }
     }).
 
-    controller('MainCtrl', function ($scope, $rootScope, $state) {
+    factory('SessionFactory', function ($resource) {
+        return $resource('/api/s');
+    }).
+
+    controller('MainCtrl', function ($scope, $rootScope, $state, SessionFactory) {
         $scope.bigButtons = {
             collapsed: false,
             rowClass: "",
@@ -69,8 +73,15 @@ angular.module('datasid', ['ngResource', 'ui.router', 'datasid.install', 'datasi
             includeUrl: '',
             error: null,
             loading: false,
-            username: '',
-            password: '',
+            username: 'admin',
+            password: '123mudar',
+            buttonText: 'Acesso Restrito',
+            click: function () {
+                if ($scope.session.loggedIn)
+                    this.logout();
+                else
+                    this.show();
+            },
             show: function () {
                 this.includeUrl = 'partials/login.html';
             },
@@ -79,19 +90,31 @@ angular.module('datasid', ['ngResource', 'ui.router', 'datasid.install', 'datasi
             },
             submit: function () {
                 this.loading = true;
+                this.error = null;
+
+                SessionFactory.save({username: $scope.login.username, password: $scope.login.password}, function (session) {
+                    $scope.login.loading = false;
 
-                setTimeout(function () {
-                    $scope.$apply(function () {
-                        $scope.login.loading = false;
-
-                        if (($scope.login.username === 'admin') && ($scope.login.password === '123mudar')) {
-                            $scope.login.hide();
-                        }
-                        else {
-                            $scope.login.error = 'Usuário ou senha inválidos.';
-                        }
-                    });
-                }, 1000);
+                    $scope.session = session;
+                    $rootScope.$broadcast('$sessionUpdate', session);
+
+                    if (session.error) {
+                        $scope.login.error = 'Usuário ou senha inválidos.';
+                        return;
+                    }
+
+                    $scope.login.username = '';
+                    $scope.login.password = '';
+                    $scope.login.hide();
+                }, function (response) {
+                    $scope.login.loading = false;
+
+                    if ((typeof response.data.error !== 'undefined') &&
+                        (response.data.error === 'invalid_username_password'))
+                        $scope.login.error = 'Usuário ou senha inválidos.';
+                    else
+                        $scope.login.error = 'Erro no servidor, tente novamente mais tarde.';
+                });
             },
             cancel: function () {
                 this.error = null;
@@ -99,9 +122,34 @@ angular.module('datasid', ['ngResource', 'ui.router', 'datasid.install', 'datasi
                 this.username = '';
                 this.password = '';
                 this.hide();
+            },
+            logout: function () {
+                SessionFactory.delete(function(session) {
+                    $scope.session = session;
+                    $rootScope.$broadcast('$sessionUpdate', session);
+                });
             }
         };
 
+        SessionFactory.get(function (session) {
+            $scope.session = session;
+            $rootScope.$broadcast('$sessionUpdate', session);
+        });
+
+        $scope.$on('$accessDenied', function (e) {
+            SessionFactory.get(function (session) {
+                $scope.session = session;
+                $rootScope.$broadcast('$sessionUpdate', session);
+            });
+        });
+
+        $scope.$on('$sessionUpdate', function (e, newSession) {
+            if (newSession.loggedIn)
+                $scope.login.buttomText = "Logout";
+            else
+                $scope.login.buttomText = "Acesso Restrito";
+        });
+
         $scope.$on("$stateChangeSuccess", function(event, toState, toParams, fromState, fromParams) {
             if (typeof $state.current === "undefined")
                 return;
diff --git a/web/config.example.js b/web/config.example.js
index 291ce456fa2bb644cb04c58d360558ef41804414..68d7314c57ff5a0a40da7c50d8d7dd3d13078cce 100644
--- a/web/config.example.js
+++ b/web/config.example.js
@@ -4,4 +4,6 @@ exports.db_config = {
     database: 'dbname',
     host: 'localhost',
     port: 5432
-};
\ No newline at end of file
+};
+
+exports.secret = '123mudar';
\ No newline at end of file
diff --git a/web/routes/sessions.js b/web/routes/sessions.js
new file mode 100644
index 0000000000000000000000000000000000000000..419a96b3ade3a23895ba532b879489d165708bd9
--- /dev/null
+++ b/web/routes/sessions.js
@@ -0,0 +1,42 @@
+exports.login = function (req, res) {
+    if (req.session.username)
+        delete req.session.username;
+
+    if (typeof req.body === 'undefined')
+        return res.send(400, {loggedIn: false, error: 'invalid_username_password'});
+
+    if ((typeof req.body.username === 'undefined') ||
+        (typeof req.body.password === 'undefined'))
+        return res.send(400, {loggedIn: false, error: 'invalid_username_password'});
+
+    var username = req.body.username,
+        password = req.body.password;
+
+    if ((username !== 'admin') || (password !== '123mudar'))
+        return res.send(400, {loggedIn: false, error: 'invalid_username_password'});
+
+    req.session.username = username;
+    res.send(200, {loggedIn: true, username: req.session.username});
+}
+
+exports.get = function (req, res) {
+    if (!req.session.username)
+        return res.send(200, {loggedIn: false});
+
+    res.send(200, {loggedIn: true, username: req.session.username});
+}
+
+exports.logout = function (req, res) {
+    if (req.session.username)
+        delete req.session.username;
+
+    res.send({loggedIn: false});
+}
+
+exports.auth = function (req, res, next) {
+    if (!req.session.username)
+        return res.send(401, "");
+
+    req.user = req.session.username;
+    next();
+}
\ No newline at end of file
diff --git a/web/server.js b/web/server.js
index 10ce519e98447586990f99ed93794aa02b729a10..3c90a47fb046a3344303e9b8214d514bf69f6abc 100755
--- a/web/server.js
+++ b/web/server.js
@@ -4,6 +4,7 @@ var express = require('express');
 var config = require('./config.js');
 var db = require('./middleware/db.js');
 
+var sessions = require('./routes/sessions.js');
 var points = require('./routes/points.js');
 var telecenters = require('./routes/telecenters.js');
 var charts = require('./routes/charts.js');
@@ -13,10 +14,16 @@ var port = parseInt(process.argv.splice(2)[0]) || 3000;
 var app = express();
 app.use(express.logger('dev'));
 app.use(express.bodyParser());
+app.use(express.cookieParser());
+app.use(express.session({ secret: config.secret }));
 app.use(express.static(__dirname + '/app'));
 
 db.config(config.db_config);
 
+app.post('/api/s', sessions.login);
+app.get('/api/s', sessions.get);
+app.delete('/api/s', sessions.logout);
+
 app.all('/api/points', db.connect, points.list);
 app.all('/api/points/count', db.connect, points.count);