【发布时间】:2016-05-24 13:22:05
【问题描述】:
我按照 Chirp MEAN 堆栈教程将 passportJS 身份验证添加到我的网站 (https://github.com/hwz/chirp)。
只要我留在单页应用程序中,登录和注册就可以正常工作(MongoDB 中的护照、存储和查找用户)。 如果我在浏览器中单击刷新/重新加载,用户似乎不再登录。
有人知道重新加载后如何获取页面的会话/用户吗? 我现在挣扎了几天,在网上找不到任何东西。非常感谢每一个帮助。
如果用户没有登录,网站的菜单会要求登录/注册。
如果用户已登录,菜单会显示用户下拉菜单。
在 Angular 中,我将以下代码用于页面菜单:
<a ui-sref="signin" class="btn btn-success" role="button" ng-hide="authenticated">Login</a>
<a ui-sref="register" class="btn btn-primary" role="button" ng-hide="authenticated">Register</a>
<span class="dropdown" ng-show="authenticated">
<button class="btn btn-success dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
{{current_user}}
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="usermenu">
<li><a ui-sref="#" ng-click="signout()">Logout</a></li>
</ul>
</span>
页面重新加载后 ng-show="authenticated" 再次为 false。 有一个 connect.sid cookie 创建并在页面重新加载后仍然存在。但似乎没有考虑在内。
AngularApp.js 看起来像:
var app = angular.module('myApp', ['ui.router']);
...
app.run(function($rootScope, $http)
{
$rootScope.authenticated = false;
$rootScope.current_user = '';
$rootScope.signout = function()
{
$http.get('auth/logout');
$rootScope.authenticated = false;
$rootScope.current_user = '';
};
});
我的猜测是,我必须在这里添加代码?
AuthenticationController.js 看起来像:
var app = angular.module('myApp');
app.controller('authController', function($scope, $http, $rootScope, $location)
{
$scope.user = {username: '', password: ''};
$scope.error_message = '';
$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;
$location.path('/');
}
else
{
$scope.error_message = data.message;
}
});
};
$scope.register = function(){
$http.post('/auth/register', $scope.user).success(function(data)
{
if(data.state == 'success')
{
$rootScope.authenticated = true;
$rootScope.current_user = data.user.username;
$location.path('/');
}
else
{
$scope.error_message = data.message;
}
});
};
});
Server.js 看起来像:
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 session = require('express-session');
var passport = require('passport');
var api = require('./routes/api');
var app = express();
//initialize mongoose schemas
require('./models/models');
var mongoose = require('mongoose'); //add for Mongo support
mongoose.connect('mongodb://localhost/myApp'); //connect to Mongo
app.set('port', process.env.PORT || 3000);
//Middleware
app.use(logger('dev'));
app.use(session({ secret: 'changedforstackoverflow', rolling: true, resave: true, saveUninitialized: false }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(__dirname + '/../frontend')); //serve static assets
app.use(passport.initialize());
app.use(passport.session());
//// Initialize Passport
var initPassport = require('./passport-init');
initPassport(passport);
var authenticate = require('./routes/authenticate')(passport);
app.use('/api', api);
app.use('/auth', authenticate);
...
如果有帮助,我可以发布更多代码。但据我所知,后端的身份验证工作正常。只有Angular在重新加载后没有从cookie中获取会话,对吧?
【问题讨论】:
标签: angularjs authentication passport.js mean-stack