javascript - 使用 Google reCaptcha 进行 Passport 身份验证

标签 javascript node.js express passport.js recaptcha

我正在尝试将 google reCaptcha 合并到我的注册表单后端,该后端已经具有 Passport 身份验证,代码如下所示:

    app.get('/signup', function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { 
            message : req.flash('signupMessage')
        });
    });

    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/app', // redirect to the secure chat section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

这是我的谷歌 recaptha 代码:

    app.get('/signup', recaptcha.middleware.render, function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { 
            message : req.flash('signupMessage'),
            captcha : req.recaptcha
        });
    });

   app.post('/signup', recaptcha.middleware.verify, function(req, res){
        if (!req.recaptcha.error) {
            //if recaptcha is correct do somthing
        }else {
            req.flash('signupMessage','reCAPTCHA Incorrect');
            res.redirect('/signup');
        }
    });

两者都是独立工作的,但是当我像这样组合它们时:

    app.get('/signup', isNotLoggedIn, recaptcha.middleware.render, function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { 
            message : req.flash('signupMessage'),
            captcha : req.recaptcha
        });
    });

    app.post('/signup', recaptcha.middleware.verify, function(req, res){
        if (!req.recaptcha.error) {
            passport.authenticate('local-signup', {
                successRedirect : '/app', 
                failureRedirect : '/signup',
                failureFlash : true
            });
        }else {
            req.flash('signupMessage','reCAPTCHA Incorrect');
            res.redirect('/signup');
        }
    });

或者这个:

    app.get('/signup', isNotLoggedIn, recaptcha.middleware.render, function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { 
            message : req.flash('signupMessage'),
            captcha : req.recaptcha
        });
    });

    app.post('/signup', recaptcha.middleware.verify, function(req, res){
        if (req.recaptcha.error) {
            req.flash('signupMessage','reCAPTCHA Incorrect');
            res.redirect('/signup');
        }
    },
    passport.authenticate('local-signup', {
        successRedirect : '/app', // redirect to the secure chat section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

页面保持加载状态,没有任何反应。

最佳答案

所以我想通了!

诀窍在于使用 next();如果验证码正确,则执行函数,因此代码最终如下所示:

    app.get('/signup', isNotLoggedIn, recaptcha.middleware.render, function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('signup.ejs', { 
            message : req.flash('signupMessage'),
            captcha : req.recaptcha
        });
    });

    app.post('/signup', recaptcha.middleware.verify, captchaVerification, passport.authenticate('local-signup', {
        successRedirect : '/app', // redirect to the secure chat section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

function captchaVerification(req, res, next) {
    if (req.recaptcha.error) {
        req.flash('signupMessage','reCAPTCHA Incorrect');
        res.redirect('/signup');
    } else {
        return next();
    }
}

这就是将 google captcha 集成到 Nodejs、express、passport、后端的方式

关于javascript - 使用 Google reCaptcha 进行 Passport 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45406548/

相关文章:

node.js - 安装express时出错

javascript - Angular ngResource 不适用于 Controller

javascript - 如何在不丢失原有功能的情况下扩展 JavaScript 中的对象

javascript - 如何在javascript中添加相同类型的变量?

javascript - 重写ajax jquery调用coffeescript

javascript - 是否在服务器端存储未解码的 jwt token ?

node.js - 我的注册路线有误

node.js - 仅对 GET 请求使用快速中间件

node.js - NodeJS/express/connect-redis : no error on redis being down; session missing

javascript - 我应该使用什么技术将内容加载到动态 div 中?