如何将护照与角度节点应用程序一起使用?
Posted
技术标签:
【中文标题】如何将护照与角度节点应用程序一起使用?【英文标题】:how to use passport with angular node app? 【发布时间】:2016-08-15 14:03:25 【问题描述】:我正在使用快速模板基于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('/');
所以我想使用护照进行身份验证,但使用客户端模板/路由来保持正确的身份验证。
有人可以指出我正确的方向吗?或者告诉我我所做的是否完全被误导了?
编辑:我的代码出现的错误是它没有重定向到个人资料页面
类型错误:POST http://localhost:3000/users/login 500 内部 服务器错误
不是一个有效的用户
【问题讨论】:
也发布你的认证策略代码。 【参考方案1】:默认情况下,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);
);
));
【讨论】:
【参考方案2】:我找到了我的问题的解决方案.. 如何在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 方法从 angular side 获得成功,如果用户通过身份验证,则使用本地护照方法进行身份验证,然后将经过身份验证的用户作为响应发送..
【讨论】:
以上是关于如何将护照与角度节点应用程序一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Passport 进行社交身份验证登录后如何重定向到个人资料页面? (角度,快递,护照,jwt)
如何将 Azure 授权社交提供程序与静态 html 角度网站一起使用?
如何在节点/套接字应用程序中验证 laravel 护照 API 令牌?