Команда Curl для дайджест-аутентификации с использованием сообщения json

(Используя node.js, экспресс, паспорт-http)

У меня есть маршрут POST, выполняющий дайджест-аутентификацию, пытаясь использовать тип содержимого application-json.

Я могу пройти маршрут GET с дайджестом без проблем, и я могу пройти маршрут POST с базовой аутентификацией без проблем, но когда я пытаюсь выполнить POST с авторизацией дайджеста, я получаю 400 - Bad Request. Похоже, что curl помещает тип содержимого в начальный запрос дайджеста (с длиной содержимого 0, поэтому он знает достаточно, чтобы не отправлять тело json в начальный запрос дайджеста-аутентификации), и моя сторона (экспресс) терпит неудачу с неверный json (пустое тело):

$ curl  -v --digest  -X POST --data @body.json --user org2user2:lameduck -H "content-type: application/json"  http://127.0.0.1:3002/user

* About to connect() to 127.0.0.1 port 3002 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 3002 (#0)
* Server auth using Digest with user 'org2user2'
> POST /user HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: 127.0.0.1:3002
> Accept: */*
> content-type: application/json
> Content-Length: 0
> 
< HTTP/1.1 400 Bad Request
< X-Powered-By: Express
< Content-Type: text/plain
< Date: Thu, 21 Mar 2013 15:33:10 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked

Кажется, я не могу понять магию curl для отправки начального пакета дайджеста без этого, добавляя только тип содержимого в фактический запрос данных, который следует.

Для справки, хотя я не думаю, что это поможет, вот расшифровка BASIC для того же звонка:

$ curl  -v --basic  -X POST --data @body.json --user org2user2:lameduck -H "content-type: application/json"  http://127.0.0.1:3002/user
* About to connect() to 127.0.0.1 port 3002 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 3002 (#0)
* Server auth using Basic with user 'org2user2'
> POST /user HTTP/1.1
> Authorization: Basic b3JnMnVzZXIyOmxhbWVkdWNr
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: 127.0.0.1:3002
> Accept: */*
> content-type: application/json
> Content-Length: 48
> 
* upload completely sent off: 48 out of 48 bytes
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: application/json; charset=utf-8
< Content-Length: 51
< Date: Thu, 21 Mar 2013 15:43:48 GMT
< Connection: keep-alive
< 
{
  "this": "is working",
  "that": "is annoying"
* Connection #0 to host 127.0.0.1 left intact
}* Closing connection #0

Любая помощь будет потрясающей.


person Michael Rowan    schedule 21.03.2013    source источник


Ответы (1)


Я столкнулся с этой же проблемой. Я не могу ответить на ваш вопрос о магии командной строки, чтобы указать CURL не отправлять тип контента при первоначальном запросе (я не думаю, что есть какая-то магия).

Тем не менее, я могу сказать вам, что основная причина проблемы заключается в том, что Node+Express(connect) отправляет первоначальный запрос дайджеста через bodyParser, и, поскольку заголовки приложения/json присутствуют, он пытается проанализировать тело (которое пусто) . Лично я не думаю, что экспресс должен сходить с ума, если тело пусто, вместо этого просто верните пустую структуру JSON (моя работа ниже).

В будущем может появиться лучший (официальный) обходной путь, так как эта конкретная проблема обсуждается прямо сейчас на github здесь (1 день назад) https://github.com/senchalabs/connect/issues/415

Мой обходной путь (connect/lib/middleware/json.js:70)

if (0 == buf.length) {
//  return next(400, 'invalid json, empty body');
    req.body = {};
    return next();
}
person CrashProof    schedule 29.03.2013