【发布时间】:2017-05-22 20:45:57
【问题描述】:
我已经完成并查看了很多 Passport JS 示例。可悲的是,没有一个像我这样。当我在server.js 文件中使用护照时,它会按预期工作,就像我复制的代码一样。
但我无法让 passport.authenticate() 在 src/server/login/routes.js 中工作
我也无法让它作为 POST 工作,它只能作为 GET 工作,我不知道为什么。
server.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var expressSession = require('express-session');
var passport = require('passport');
var passportLocal = require('passport-local');
var User = require('server/db/db').User;
var routes = require('server/routes');
var PORT = process.env.PORT || 3000;
app.use(bodyParser.json());
app.use(cookieParser());
app.use(expressSession({
secret: process.env.SESSION_SECRET || 'mySecret',
resave: true,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new passportLocal.Strategy(function(username, password, done) {
console.log('localStrat Username: ' + username + ' Password: ' + password);
User.findOne({username: username, password: password}, function(err, user) {
console.log('searched for user');
if(user) {
console.log('found');
console.log(user);
done(null, user);
} else {
console.log('none');
done(null, false, {message: 'Unable to login'});
}
});
// if(username === password) {
// done(null, {id: username, name: username});
// } else {
// done(null, false, {message: 'Unable to login'});
// }
}));
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
done(null, {id: id, name: id});
});
routes(app);
app.get('/', function(req, res) {
res.send('\
<!DOCTYPE html>\
<html>\
<head>\
<title>TCG Inventory Manager</title>\
<base href="/">\
</head>\
<body>\
<div ui-view></div>\
<script src="bundle.js"></script>\
</body>\
</htm>\
');
});
app.get('/login', passport.authenticate('local'), function(req, res) {
console.log('/login');
res.send(req.user);
});
src/config/config.js
import angular from 'angular';
import uiRouter from 'angular-ui-router';
import uiBootstrap from 'angular-ui-bootstrap';
import todoFactory from 'factories/todo-factory';
import invManFactory from 'factories/invMan-factory';
import loginFactory from 'factories/login-factory';
import todosController from 'todos/todos';
import invController from 'invMan/invMan';
import loginController from 'login/login';
const app = angular.module('app', [uiRouter, todoFactory.name, invManFactory.name, loginFactory.name, uiBootstrap]);
app.config(($stateProvider, $urlRouterProvider, $locationProvider) => {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('todos', {
url: '/todo',
template: require('todos/todos.html'),
controller: todosController
})
.state('about', {
url: '/about',
template: require('about/about.html')
})
.state('invMan', {
url: '/invMan',
template: require('invMan/invMan.html'),
controller: invController,
resolve: { loginCheck: checkLogin }
})
.state('login', {
url: '/',
template: require('login/login.html'),
controller: loginController
})
$locationProvider.html5Mode(true);
});
var checkLogin = function($q, $timeout, $http, $location, $rootScope) {
console.log('checkLogin');
var deffered = $q.defer();
$http.get('/login/stuff/loggedIn').success(function(user) {
$rootScope.errorMessage = null;
// User is Authenticated
if(user !== '0') {
console.log('is authed');
$rootScope.currentUser = user;
deffered.resolve();
// User is not Authenticated
} else {
console.log('not authed');
$rootScope.errorMessage = 'You need to be log in.';
deffered.reject();
$location.url('/');
}
});
return deffered.promise;
};
export default app;
src/server/routes.js
var loginRoutes = require('server/login/routes');
var todosRoutes = require('server/todos/routes');
var invManRoutes = require('server/invMan/routes');
module.exports = function routes(app, passport) {
app.use('/todos', todosRoutes);
app.use('/invMan', invManRoutes);
app.use('/login/stuff', loginRoutes);
};
src/server/login/routes.js
var express = require('express');
var mongoose = require('mongoose');
var User = require('server/db/db').User;
var router = express.Router();
router.get('/', passport.authenticate('local'), function(req, res) {
console.log('login');
res.send(req.body);
});
router.get('/loggedIn', function(req, res) {
res.send(req.isAuthenticated() ? req.user : '0');
});
module.exports = router;
提前感谢您的帮助!
【问题讨论】:
标签: javascript angularjs node.js passport.js passport-local