1

(node.js、express、passport-httpを使用)

ダイジェスト認証を実行し、application-jsonコンテンツタイプを試行するPOSTルートがあります。

ダイジェストを使用してGETルートを問題なくヒットでき、基本認証を使用してPOSTルートを問題なくヒットできますが、ダイジェスト認証を使用してPOSTを実行しようとすると、400-不正な要求が発生します。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

これなしでダイジェスト初期パケットを送信するカールの魔法を理解できないようです。後続の実際のデータ要求にコンテンツタイプを追加するだけです。

参考までに、役に立たないと思いますが、同じ呼び出しの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

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

私はこれと同じ問題に遭遇しました。最初のリクエストでコンテンツタイプを送信しないようにCURLに指示するコマンドラインマジックについての質問に答えることはできません(マジックはないと思います)。

ただし、問題の根本的な原因は、Node + Express(connect)がbodyParserを介して最初のダイジェスト要求を送信しており、application / jsonヘッダーが存在するため、本体(空)を解析しようとしていることです。 。個人的には、本文が空の場合にexpressがおかしくなることはないと思います。代わりに、空の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();
}
于 2013-03-29T18:28:43.230 に答える