对passportjs+Node.js+Express.js Rest API调用成功身份验证和失败的路由处理程序
Invoke route handlers on both, Successful Authentication and failure, for passportjs + Node.js + Express.js Rest API
请使用Rest API的passport基本策略来查看此基本登录/令牌过程:
路线:
router.get('/token', authenticate.basic, controller.token);
验证基本策略:
authenticate.basic = passport.authenticate('basic', {session: false});
/* implementation of the Basic Strategy*/
passport.use('basic', new BasicStrategy(function(username, password, done) {
authenticationService.login(username, password).then(function(user) {
if (!user) {
return done(null, false, { message: 'Login failed' });
}
return done(null, user);
}).catch(function(e) {
return done(e)
});
}));
令牌控制器(路由处理程序):
controller.token = function(req, res, next) {
if (!req.user) {
// TODO fix this dead branch
return res.json(401, {error: "Login failed"});
}
authService.issueToken(req.user).then(function(token) {
var user = {
user_id: req.user.id,
access_token: token
}
return res.json(user);
}).catch(function(e) {
return next(e);
});
};
如文件中所述:
默认情况下,如果身份验证失败,Passport将返回401未授权状态,任何其他路由处理程序都不会调用。如果身份验证成功,将调用下一个处理程序req.user属性将被设置为经过身份验证的用户。
有没有一种方法可以绕过这种行为,即使身份验证失败也可以调用路由处理程序?
您正在寻找Passport的"自定义回调"功能。
基本上,您需要为authenticate方法提供第三个参数来覆盖默认行为。这意味着应用程序将负责登录用户,这只是调用req.login()
方法的问题。
authenticate.basic = function (req, res, next) {
passport.authenticate('basic', {
session: false
}, function(err, user, info) {
if (err) {
// Authentication failed, you can look at the "info" object
return next(err);
}
if (!user) {
// The user is not logged in (no token or cookie)
return res.redirect('/login');
}
req.login(user, function(err) {
if (err) {
// Something wrong happened while logging in, look at the err object
return next(err);
}
// Everything's good!
return res.redirect('/users/' + user.username);
});
})(req, res, next);
}
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 未激发路由的控制器属性上的观察者
- AngularJS ui路由器html5模式中断路由
- 发送json对象或使用express路由呈现视图
- 使用主干网和rails的静态页面路由
- 如何使用Passport保护路由终结点
- 如何使失败的路由解析承诺加载不同的模板URL
- NodeJS Express 递归路由失败 (404)
- 对passportjs+Node.js+Express.js Rest API调用成功身份验证和失败的路由处理程序
- 处理路由时出现Ember错误:列出断言失败
- 由于某些原因,基于路由参数动态注入特定工厂会失败
- Nodejs / express - fresh install在尝试导航到路由时失败
- 在谷歌地图API 3中清除方向服务的路由失败
- 当' mapHooks '失败时重定向到另一个路由
- GET方法;位置”;node-js应用程序中的路由失败
- Google Maps v3 API获取路由持续时间失败