当前位置: 首页 > 面试题库 >

Passport.js身份验证失败时发送回JSON响应

郎嘉树
2023-03-14
问题内容

我正在Node.js用作iPhone客户端的后端API服务器。我正在使用Passport.js进行身份验证local strategy。相关代码如下:

// 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);
        });
    });
});

// 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('/');
});

现在,我设法将失败的登录重定向到/
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);
        });
    });
});

但是回到当我尝试console.log(info)时,它只是说未定义。我不知道如何使此自定义回调工作…任何帮助将不胜感激!


问题答案:

我相信您的“身份验证”静态调用(在代码中称为“回调”)的回调函数接受代码可以提供的第三个参数-“
info”。然后,而不是传入{failureRedirect:…}对象,而是传入一个带有3个参数的函数-
err,user和info。您在authenticate方法中提供的“信息”将传递给此回调。

Passport将此情况称为“自定义回调”。请参阅此处的文档:http
:
//passportjs.org/guide/authenticate/



 类似资料:
  • Tweepy API请求twitter return me Twitter错误响应:状态代码=401。 这是我的实际代码: 我曾试图用tweepy软件包删除推文,并获得了所有必需的密钥。镊子包装不起作用吗?有人能帮我解决这个问题吗。

  • 每次我尝试用Pycharm在GitHub中推送一个存储库时,它都会失败。 在Settings->Version Control->Git中,Git可执行文件的路径是用完整路径设置的,SSH可执行文件:Buil-in Win 7上的Pycharm版本3.1.1 Git版本1.8.4.msysgit.0。

  • 问题内容: 尝试使用JavaMail中的NTLM连接到Exchange服务器。我可以连接到SMTP,但不能连接到IMAP。我还可以使用相同的主机/用户名/密码通过OS X Mail.app应用程序进行身份验证,帐户类型=“ IMAP”,端口143,ssl = false,authentication = NTLM,域名=“。 连接代码: 输出: 我尝试通过http://www.oracle.com

  • 我相对来说是JMeter的新手,但是我很难让HTTP Sampler登陆到一个安全的网页上。我认为它需要NTLM认证,所以我使用HTTP授权管理器来传递BlazeMeter指南中指定的凭证 我的授权管理器具有以下值: 基本网址: https:// [测试站点] 用户名: [我的用户名] 密码: [我的密码] 域:与基本网址相同 机制: BASIC_DIGEST 然而,我只是得到一个401错误(见下

  • 我已经使用GitHub有一段时间了,我对,和都很好,到目前为止没有任何问题。突然我有一个错误,说: 致命:身份验证失败 在终端中,我克隆了一个存储库,处理了一个文件,然后使用将文件添加到提交日志中,当我执行时,它工作得很好。最后,要求输入用户名和密码。我把它们正确地放进去,每次我这样做,它都会说同样的错误。 这个问题的原因是什么,我该如何解决? 是:

  • 我使用Github已经有一段时间了,使用、和都很好,到目前为止没有任何问题。突然我有一个错误说: 致命:身份验证失败 在终端中,我克隆了一个存储库,处理了一个文件,然后使用将文件添加到提交日志中,当我执行时,它工作得很好。最后,询问用户名和密码。我把那些正确地放进去,每次我这样做,它说同样的错误。 有没有人知道这个问题的原因是什么,我该怎么修复它? 的内容是: