0

我正在发送用户名、密码和 h-captcha-response 令牌以通​​过登录表单表达。用户名和密码从表单中很好地发送,没有单引号,h-captcha-response(由 hcaptcha 制定并发送回网络表单并发送)正在发送,带有单引号和 hcaptcha中间件 ( express-hcaptcha ) 看不到任何令牌。中间件的响应是......

Error: bad request - no token provided in body

我正在使用https://github.com/vastus/express-hcaptcha

当我转储 req 时,我看到 h-captcha-response 用单引号括起来。我相信这可能与发送到 express 的表单输入未设置为 application/json 有关,但这是一个猜测,因为我是 node/express 的新手。

req 转储的适用部分在下面,后面是节点/快递信息。有人可以指出我正确的方向吗?非常感谢JW

请求转储(通过 console.log )

————-
<snip>
….
….
body:
   { username: ‘xxxx’,
     password: ‘xxxx’,
     'h-captcha-response': ‘xxxxxxxxxxxxxx’ },
  _body: true,
  length: undefined,
….
….
<snip>

js文件的相应部分——————</p>

const http = require('http');
const mysql = require('mysql');
const express = require('express');
const session = require('express-session');
const cors = require('cors');
const hcaptcha = require('express-hcaptcha');

//hcaptcha secret key
const SECRET = “xxxxxx”; 

var bodyParser = require('body-parser');

var connection = mysql.createConnection({
…..<snip>
});

const path = require('path');
const app = express();

app.use(cors());
app.use(bodyParser.json());
app.set("view engine","hbs");

app.use(bodyParser.urlencoded({extended : true}));


//create app server
var server = app.listen(3000,  "0.0.0.0", function () {
  var host = server.address().address
  var port = server.address().port
});

app.post('/verify', hcaptcha.middleware.validate(SECRET), (req, res) => {
  res.json({message: 'verified!', hcaptcha: req.hcaptcha});
});

4

1 回答 1

1

'h-captcha-response'用引号引起来,因为这是您可以-在 javascript 中创建包含特殊字符(在本例中)的对象键的唯一方法:

const bad = { a-b: '' }
            // ^ Parsing error: unexpected token, expected ","

const good = { 'a-b': '' } // no error

虽然 node 没有在这里创建对象,而只是将其登录到控制台,但它仍然尊重常见的 js 语法。

至于错误:Error: bad request - no token provided in body。发生这种情况是因为express-hcaptcha中间件需要名为token. 如果该字段不存在或评估为虚假值,您将收到您现在可以观察到的错误。

如果您要发送数据,application/x-www-form-urlencoded那么要解决问题,您必须将namehtml 表单中的验证码字段的属性从h-captcha-response更改为token

如果您要发送数据,json则对发送 json 对象的键进行相同的重命名。

于 2021-07-02T06:53:24.937 回答