我正在开发一个基于angular.js + node.js
和mongodb
的简单博客网站,使用快速模板。
我通过POST方法从角度控制器点击$http
到名为users.js
的api,其中使用passport.authenticate
方法对登录进行身份验证。
我需要users.js
中的护照本地登录策略
但它没有工作。角度登录服务代码和节点用户api代码。
谁能告诉我如何在角度和节点中使用passport.js
?
通过服务进行角度路由
app.service('Auth',function($location,$http,$localStorage){
var userLogin ;
return{
setLogIN:function(email,password){
$http({
method: 'POST',
url: '/users/login', //users.js having node routing.
data: {email:email, password:password},
})
用户中的节点路由
router.post('/login',passport.authenticate('local', {
// use passport-local for authentication
successRedirect : '/profile',
failureRedirect : '/login',
failureFlash : true
}));
护照本地策略
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(
function (username, password, done) {
User.findOne({username: username}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, {alert: 'Incorrect username.'});
}
if (user.password != password) {
return done(null, false, {alert: 'Incorrect password.'});
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
function isAuthenticated(req,res,next){
if(req.isAuthenticated())return next();
res.redirect('/');
}
所以我想使用护照进行身份验证,但使用客户端模板/路由来保持正确的身份验证。
有人可以指出我正确的方向吗?或者告诉我,我在做什么是完全被误导了?
编辑:我的代码错误是它没有重定向到个人资料页面
TypeError:POST http://localhost:3000/users/login 500内部 服务器错误
不是有效用户
答案 0 :(得分:3)
我找到了解决问题的方法.. 如何使用带有angular-nodejs路由的护照.......
//angular js routing
$scope.userlogin=function(){
$http({
method:"post",
url:'/users/login',
data:{username:$scope.username,password:$scope.password},
}).success(function(response){
$scope.userData = response;
$localStorage.userData = $scope.userData;
console.log("success!!");
$location.path("/profile")
}).error(function(response){
console.log("error!!");
$location.path("/login")
});
}
我使用POST方法并点击节点(users.js)控制器并从中获取响应。如果用户身份验证成功,则它将重新定位到配置文件视图,否则将保留在登录视图中。
//add these two lines to app.js
// var app = express();
app.use(passport.initialize());
app.use(passport.session());
//node routing
// add passport-stretegies to users.js
passport.use(new LocalStrategy(function(username, password, done) {
user.findOne({username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (user.password != password) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
// console.log(user)
});
}));
//passport serialize user for their session
passport.serializeUser(function(user, done) {
done(null, user.id);
});
//passport deserialize user
passport.deserializeUser(function(id, done) {
user.findById(id, function(err, user) {
done(err, user);
});
});
//router on same page
router.post('/login',passport.authenticate('local'),function(req,res){
res.send(req.user);
//console.log(req.user);
});
通过post方法从角边获取命中如果用户成功通过验证,则使用护照本地方法进行身份验证,然后将经过身份验证的用户作为响应发送..
答案 1 :(得分:2)
默认情况下,LocalStrategy
要求字典参数命名为username
和password
。
如果您想使用email
代替username
,那么您应该在策略中定义它们:
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(username, password, done) {
// ...
}
));
对于您的情况,它应该是:
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function (username, password, done) {
User.findOne({username: username}, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, {alert: 'Incorrect username.'});
}
if (user.password != password) {
return done(null, false, {alert: 'Incorrect password.'});
}
return done(null, user);
});
}
));