kur*_*kun 53 javascript authentication node.js passport-local passport.js
抱歉,我对node.js很新,所以我还没有能够解决这个问题.我正在使用Node.js作为iPhone客户端的后端API服务器.我正在使用Passport.js通过本地策略进行身份验证.相关代码如下:
// This is in user.js, my user model
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
console.log('verifyPassword error occurred');
return callback(err);
}
if (!passwordCorrect){
console.log('Wrong password');
return callback(err, false);
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
Run Code Online (Sandbox Code Playgroud)
和
// This is in app.js
app.get('/loginfail', function(req, res){
res.json(403, {message: 'Invalid username/password'});
});
app.post('/login',
passport.authenticate('local', { failureRedirect: '/loginfail', failureFlash: false }),
function(req, res) {
res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)
现在,我设法将失败的登录重定向到/ loginfail,在那里我将一些JSON发送回iPhone客户端.但是,这没有足够的粒度.我希望能够将相应的错误发送回iPhone客户端,例如:"找不到用户"或"密码错误".使用我现有的代码,我不知道如何实现这一目标.
我试图在passport.js网站上按照示例进行自定义回调,但由于缺乏节点理解,我无法让它工作.我怎么能修改我的代码,以便我能够发回一个带有相应错误代码/消息的res.json?
编辑:我正在尝试这样的事情:
// In app.js
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
console.log(info);
// *** Display message without using flash option
// re-render the login form with a message
return res.redirect('/login');
}
console.log('got user');
return res.json(200, {user_id: user._id});
})(req, res, next);
});
// In user.js
UserSchema.static('authenticate', function(username, password, callback) {
this.findOne({ username: username }, function(err, user) {
if (err){
console.log('findOne error occurred');
return callback(err);
}
if (!user){
return callback(null, false);
}
user.verifyPassword(password, function(err, passwordCorrect){
if (err){
return callback(err);
}
if (!passwordCorrect){
return callback(err, false, {message: 'bad password'});
}
console.log('User Found, returning user');
return callback(null, user);
});
});
});
Run Code Online (Sandbox Code Playgroud)
但是当我尝试console.log(info)时,它只是说未定义.我不知道如何让这个自定义回调工作...任何帮助将不胜感激!
Mne*_*quo 61
我在Passport和登录响应失败方面遇到了类似的问题.我正在构建一个API,并希望所有响应都以JSON的形式返回.Passport响应无效密码,状态为:401,正文:"未授权".这只是正文中的一个文本字符串,而不是JSON,所以它打破了我的客户端,期望所有JSON.
事实证明,有一种方法可以让Passport将错误返回到框架,而不是尝试自己发送响应.
答案是设置Passport传递给身份验证的选项:https:
//github.com/jaredhanson/passport/issues/126#issuecomment-32333163
来自jaredhanson在该问题上的评论:
app.post('/login',
passport.authenticate('local', { failWithError: true }),
function(req, res, next) {
// handle success
if (req.xhr) { return res.json({ id: req.user.id }); }
return res.redirect('/');
},
function(err, req, res, next) {
// handle error
if (req.xhr) { return res.json(err); }
return res.redirect('/login');
}
);
Run Code Online (Sandbox Code Playgroud)
这将在Passport调用后调用错误处理程序JSON.对于我的应用程序,我写了一个特定于我的用例的通用错误处理程序,只是提供了一个JSON错误:
// Middleware error handler for json response
function handleError(err,req,res,next){
var output = {
error: {
name: err.name,
message: err.message,
text: err.toString()
}
};
var statusCode = err.status || 500;
res.status(statusCode).json(output);
}
Run Code Online (Sandbox Code Playgroud)
然后我将它用于所有api路线:
var api = express.Router();
...
//set up some routes here, attached to api
...
// error handling middleware last
api.use( [
handleError
] );
Run Code Online (Sandbox Code Playgroud)
我没有401在文档中找到该选项.我在跟踪调试器中的代码时偶然发现了它.
另外,在我想出这个之前,我尝试了@Kevin_Dente答案中提到的"自定义回调",但它对我不起作用.我不确定这是用于旧版本的Passport,还是我做错了.
Kev*_*nte 28
我相信你的'authenticate'静态调用(在代码中称为'callback')的回调函数接受第三个参数 - "info" - 你的代码可以提供.然后,传入一个带有3个参数的函数 - 错误,用户和信息,而不是传入{failureRedirect:...}对象.您在authenticate方法中提供的"info"将传递给此回调.
Passport将此方案称为"自定义回调".请参阅此处的文档:http: //passportjs.org/guide/authenticate/
有关自定义回调的官方文档:
app.get('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)
https://github.com/passport/www.passportjs.org/blob/master/views/docs/authenticate.md
| 归档时间: |
|
| 查看次数: |
44608 次 |
| 最近记录: |