【发布时间】:2011-12-29 06:31:56
【问题描述】:
我正在尝试在网站的注册页面上放置验证码。 如何在 node.js 中显示验证码?
【问题讨论】:
我正在尝试在网站的注册页面上放置验证码。 如何在 node.js 中显示验证码?
【问题讨论】:
有nodejs-recaptcha,但不知道成熟度如何。
【讨论】:
你可以使用nodejs-recaptcha。
这是我的示例,最后使用 Express 框架处理 ajax 后请求以显示受 reCaptcha 保护的联系人数据。
app.post('/ajax/contact/', function(req, res, next) {
var recaptcha = new recaptcha_async.reCaptcha();
// Eventhandler that is triggered by checkAnswer()
recaptcha.on('data', function (recaptcha_response) {
res.render('contact', {
layout: 'contact_layout.json.ejs',
locals: {
recaptcha: recaptcha_response.is_valid ? 'valid' : 'invalid'
}
});
});
// Check the user response by calling the google servers
// and sends a 'data'-event
recaptcha.checkAnswer('aLfsZvFVbAbAbzsxlnHbH7wxx0PbNbGabHXbpZgl', // private reCaptchakey (invalidated)
req.connection.remoteAddress,
req.body.recaptcha_challenge_field,
req.body.recaptcha_response_field);
});
【讨论】:
【讨论】:
我找到了一个用纯js写的很聪明的:
特点
它会生成像这样的png:
这是我的代码:
ejs -[express3.x]
<img src="data:image/jpeg;base64,<%= valicode %>"/>
js
var captchaImg = function(){
var p = new captchapng(80,30,parseInt(Math.random()*9000+1000)); // width,height,numeric captcha
p.color(115, 95, 197, 100); // First color: background (red, green, blue, alpha)
p.color(30, 104, 21, 255); // Second color: paint (red, green, blue, alpha)
var img = p.getBase64();
var imgbase64 = new Buffer(img,'base64');
return imgbase64;
}
exports.index_get = function(req, res){
var valicode = new Buffer(captchaImg()).toString('base64');
res.render('index', {'valicode' : valicode});
};
【讨论】:
new captchapng(width,height,numeric),你可以把外面的数字放到会话范围内。
它使用 MNIST 数据库生成数字验证码图像。很容易集成。我在以前的网站上使用过它,它生成的验证码图像看起来像this
用法也很简单。下面是一个 GET 请求示例,用于在每个请求(Express)上生成一个新的验证码图像:
let Captcha = require('node-captcha-generator');
router.get('/imageGen', function(req, res, next) {
var c = new Captcha({
length:5, // Captcha length
size:{ // output size
width: 450,
height: 200
}
});
c.toBase64(function(err, base64){
base64Data = base64.replace(/^data:image\/png;base64,/, "");
base64Data += base64Data.replace('+', ' ');
console.log(base64Data);
binaryData = new Buffer(base64Data, 'base64').toString('binary');
if(err){
console.log("Captcha Error");
console.log(err);
}
else{
res.contentType('image/png');
res.end(binaryData,'binary');
}
});
});
希望这个答案有所帮助,并且与 reCaptcha 不同,不需要 HTTPS 证书即可集成到您的网站中。非常适合大学/业余爱好项目
【讨论】: