Как использовать сессию в приложении Nodejs

0

Я новичок в веб-приложениях Node, в настоящее время работая над простой аутентификацией. Когда я регистрируюсь или заходил в систему, я успешно сохраняю пользователя в сеансе, но когда я обновляю страницу, он фактически обновляет все угловые модули и сеанс обновления. Я не могу понять, как использовать сеанс в узле. Мой код выглядит следующим образом.

//adding opensource modules to application 
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var bcrypt = require('bcrypt-nodejs');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var session = require('express-session');
var mongoose = require('mongoose');
var models_user = require('./Angular/Models/user.js');

//connection database
mongoose.connect('mongodb://localhost/AngularizeApp');

//import the routers
var router = require('./Routes/router');
var authenticate = require('./Routes/authentication')(passport);

//for using express throughout this application
var app = express();

//tell node that My application will use ejs engine for rendering, view engine setup
app.set('views', path.join(__dirname, 'Views'));
app.set('view engine', 'ejs');

//tell node the global configuration about parser,logger and passport
app.use(logger('dev'));
app.use(session({
  secret: 'keyboard cat'
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(passport.initialize()); //initializing passport
app.use(passport.session()); //initializing passport session

//tell node about these directories that application may get resources from
app.use('/', router);
app.use('/auth', authenticate);
app.use(express.static(path.join(__dirname, 'scripts')));
app.use(express.static(path.join(__dirname, 'Content')));
app.use(express.static(path.join(__dirname, 'Angular')));
app.use(express.static(path.join(__dirname, 'Views/Main')));
app.use(express.static(path.join(__dirname, 'Views/Authentication')));


//providing auth-api to passport so that it can use it.
var initPassport = require('./Passport/passport-init');
initPassport(passport);

//running server on node
var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

//exporting this application as a module
module.exports = app;

Вот как я сохраняю пользователя в модуле приложения.

//Angular Starter App
var main = angular.module("main", ['ui.router','ngRoute','ngResource'])
.run(function($http,$rootScope)
{
    //defining global veriables
    $rootScope.roles = [{
          name: "Administrator",
          code: 0
       }, {
          name: "Staff",
          code: 1
       }, {
          name: "General",
          code: 2
    }];            
    //adding authentication global variables
    if($rootScope.sess){
        $rootScope.authenticated = true;
        $rootScope.current_user = $rootScope.sess.username;
    }
    else{
        $rootScope.sess = null;
        $rootScope.authenticated = false;
        $rootScope.current_user = 'Guest';
    }

    $rootScope.signout = function(){
        $http.get('auth/signout');
        $rootScope.authenticated = false;
        $rootScope.current_user = 'Guest';
    };
});

//Routing Configuration (define routes)
main.config([
    '$stateProvider', '$urlRouterProvider', '$httpProvider',
    function ($stateProvider, $urlRouterProvider,$rootScope) {
        $urlRouterProvider.otherwise('/');
        $stateProvider
            .state('home', {
                url: '/',
                templateUrl: 'Index.html',
                caseInsensitiveMatch: true,
                controller: 'MainController'
            })
            .state('contact', {
                url: '/contact',
                templateUrl: 'Contact.html',
                caseInsensitiveMatch: true,
                controller: 'MainController'
            })
            .state('about', {
                url: '/about',
                templateUrl: 'About.html',
                caseInsensitiveMatch: true,
                controller: 'MainController'
            })
            .state('login',{
                url: '/login',
                templateUrl: 'login.html',
                caseInsensitiveMatch: true,
                controller: 'AuthController'
            })
            .state('register',{
                url: '/register',
                templateUrl: 'register.html',
                caseInsensitiveMatch: true,
                controller: 'AuthController'
            })
            .state('unauth',{
                url: '/unauth',
                templateUrl: 'unauth.html',
                caseInsensitiveMatch: true
            });
    }
]);

Я знаю, что угловой модуль обновится при обновлении страницы, и здесь я сохраняю свою сессию в своем AuthController

$scope.login = function(){
    $http.post('/auth/login', $scope.user).success(function(data){
        if(data.state == 'success'){
            $rootScope.authenticated = true;
            $rootScope.current_user = data.user.username;
            $rootScope.sess = data.user;
            console.log($rootScope.sess);   
            $location.path('/');
        }
        else{
            $scope.error_message = data.message;
            $rootScope.sess = null;
        }
    });
};

Любая помощь будет очень оценена.

Теги:
express

2 ответа

1
Лучший ответ

Вы можете использовать sessionStorage для этого. У меня была такая же проблема в моем веб-приложении, и это решило мою проблему.

if($rootScope.sess){
  $rootScope.authenticated = true;
  sessionStorage.setItem('current_user', $rootScope.sess.username);

}

Надеюсь, что это работает для вас.

0

Вы должны использовать токен и хранить его в файлах cookie. Также вы должны предоставить этот файл cookie по каждому запросу (используйте также функцию "interseption"). После этого сервер должен принять и подготовить этот токен (найти пользователя по идентификатору сеанса), и ваш сервер должен записывать токен в заголовке ответа все время до тех пор, пока токен не будет действителен. Вы можете взглянуть на паспорт.js.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню